<?php
namespace App\Controller;
use App\Entity\{CaseHistory, CaseMedicine, CaseReferral, Cases, HivRegister, TBRegister, WardBed};
use App\Form\{CaseReferralType, CaseType};
use App\Repository\{CaseRepository, HivRegisterRepository, PatientRepository, TBRegisterRepository};
use App\Service\{Pagination, Abha};
use Doctrine\ORM\EntityManagerInterface;
use Dompdf\Dompdf;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\{IsGranted, Security};
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\{JsonResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route;
use Nzo\UrlEncryptorBundle\Annotations\ParamDecryptor;
use Nzo\UrlEncryptorBundle\Encryptor\Encryptor;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpClient\HttpClient;
use Doctrine\Persistence\ManagerRegistry;
#[Route(path: '/cases'), IsGranted(data: 'IS_AUTHENTICATED_REMEMBERED')]
class CaseController extends AbstractController
{
private $encryptor;
public function __construct(Encryptor $encryptor, private ManagerRegistry $doctrine)
{
$this->encryptor = $encryptor;
}
#[Route(path: '/', name: 'case_index', methods: ['GET'])]
public function index(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
if ($this->isGranted('ROLE_DOC')) {
$qb = $caseRepo->getForDoctors($this->getUser());
} else {
$qb = $caseRepo->getForOthers($this->getUser()->getHospital());
}
if ($request->get('range')) {
[$from, $to] = explode(' / ', $request->get('range'));
if ($from && $to) {
$qb
->andWhere('c.createdAt BETWEEN :from AND :to')
->setParameter('from', $from)
->setParameter('to', $to);
}
}
$cases = $pagination->paginate($qb->getQuery(), $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Cases'
]);
}
#[Route(path: '/laboratory', name: 'case_lab', methods: ['GET'])]
public function labCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getWithLabTests($this->getUser()->getHospital());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Laboratory Summary'
]);
}
#[Route(path: '/pharma', name: 'case_pharma', methods: ['GET'])]
public function pharmaCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getPharmaCases($this->getUser()->getHospital());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Pharmacy Cases'
]);
}
#[Route(path: '/labor', name: 'case_labor', methods: ['GET'])]
public function laborCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getLaborCases($this->getUser()->getHospital());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Labor room Summary'
]);
}
#[Route(path: '/ward', name: 'case_ward', methods: ['GET'])]
public function wardCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getWardCases($this->getUser()->getHospital());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Ward Cases'
]);
}
#[Route(path: '/discharged', name: 'case_discharged', methods: ['GET'])]
public function dischargedCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getDischargedCases($this->getUser()->getHospital());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Discharge Summary'
]);
}
#[Route(path: '/emergency', name: 'case_emergency', methods: ['GET'])]
public function emergencyCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getEmergencyCases($this->getUser()->getHospital());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Emergency Cases'
]);
}
#[Route(path: '/medicolegal', name: 'case_medicolegal', methods: ['GET'])]
public function medicolegalCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getMedicolegalCases($this->getUser()->getHospital());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Medicolegal Cases'
]);
}
#[Route(path: '/mortality', name: 'case_mortality', methods: ['GET'])]
public function mortalityCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getMortalityCases($this->getUser()->getHospital());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Mortality Cases'
]);
}
#[Route(path: '/expert-opinions', name: 'case_exprt_opinion', methods: ['GET']), IsGranted(data: 'ROLE_DOC')]
public function expertOpinionCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$query = $caseRepo->getExpertOpinionCases($this->getUser());
$cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page'));
return $this->render('cases/expert_opinions.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases)
]);
}
#[Route(path: '/add-expert-opinion/{id}', name: 'case_add_exprt_opinion', methods: ['GET', 'POST']), IsGranted(data: 'ROLE_DOC')]
#[ParamDecryptor(["id"])]
public function addOpinion(Request $request, CaseReferral $caseRef, CaseRepository $caseRepo, EntityManagerInterface $entityManager): Response
{
$form = $this->createForm(CaseReferralType::class, $caseRef);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush();
$this->addFlash(
'success',
'Expert Opinion added successfully!'
);
return $this->redirectToRoute('case_exprt_opinion');
}
$case = $caseRef->getCase();
$symptoms = $caseRepo->getCaseSymptoms($case->getId());
$provisionalExaminations = $caseRepo->getCaseProvisionalExaminations($case->getId());
$provisionalDiagnosis = $caseRepo->getCaseProvisionalDiagnosis($case->getId());
$clinicalPatterns = $caseRepo->getCaseClinicalPatterns($case->getId());
return $this->renderForm('cases/add_opinion.html.twig', [
'form' => $form,
'case' => $case,
'case_tests' => $caseRepo->getCaseTests($case->getId()),
'case_medicines' => $caseRepo->getCaseMedicines($case->getId()),
'symptoms' => $symptoms ? implode(', ', $symptoms) : '—',
'provisional_diagnosis' => $provisionalDiagnosis ? implode(', ', $provisionalDiagnosis) : '—',
'provisional_examinations' => $provisionalExaminations ? implode(', ', $provisionalExaminations) : '—',
'clinical_patterns' => $clinicalPatterns ? implode(', ', $clinicalPatterns) : '—'
]);
}
#[Route(path: '/print-ref-letter/{id}', name: 'case_print_ref_letter', methods: ['GET']), IsGranted(data: 'ROLE_DOC')]
#[ParamDecryptor(["id"])]
public function printRefLetter(CaseReferral $caseRef, CaseRepository $caseRepo)
{
$caseId = $caseRef->getCase()->getId();
return $this->render('cases/print_ref_letter.html.twig', [
'case_ref' => $caseRef,
'action_type' => 'print',
'prov_diags' => implode(', ', $caseRepo->getCaseProvisionalDiagnosis($caseId)),
'prov_exam' => implode(', ', $caseRepo->getCaseProvisionalExaminations($caseId)),
'treatment_given' => implode('<br>', array_merge(
array_column($caseRepo->getCaseMedicines($caseId), 'name'),
array_column($caseRepo->getCaseWardMedicines($caseId), 'name')
))
]);
}
#[Route(path: '/download-ref-letter/{id}', name: 'case_pdf_ref_letter', methods: ['GET']), IsGranted(data: 'ROLE_DOC')]
#[ParamDecryptor(["id"])]
public function downloadRefLetter(CaseReferral $caseRef, CaseRepository $caseRepo)
{
$caseId = $caseRef->getCase()->getId();
$html = $this->renderView('cases/print_ref_letter.html.twig', [
'case_ref' => $caseRef,
'action_type' => 'pdf',
'prov_diags' => implode(', ', $caseRepo->getCaseProvisionalDiagnosis($caseId)),
'prov_exam' => implode(', ', $caseRepo->getCaseProvisionalExaminations($caseId)),
'treatment_given' => implode('<br>', array_merge(
array_column($caseRepo->getCaseMedicines($caseId), 'name'),
array_column($caseRepo->getCaseWardMedicines($caseId), 'name')
))
]);
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('referral-letter.pdf', [
'Attachment' => true
]);
}
#[Route(path: '/patient-summary', name: 'case_summary', methods: ['GET'])]
public function casesSummary(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response
{
$qb = $caseRepo->getAllCases($this->getUser()->getHospital());
if ($request->get('range')) {
[$from, $to] = explode(' / ', $request->get('range'));
if ($from && $to) {
$qb
->andWhere('c.createdAt BETWEEN :from AND :to')
->setParameter('from', $from)
->setParameter('to', $to);
}
}
$cases = $pagination->paginate($qb->getQuery(), $request, $this->getParameter('items_per_page'));
return $this->render('cases/index.html.twig', [
'cases' => $cases,
'last_page' => $pagination->lastPage($cases),
'title' => 'Patients Summary'
]);
}
#[Route(path: '/new', name: 'case_new', methods: ['GET', 'POST'])]
#[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')")]
public function new(Request $request, CaseRepository $caseRepo, Abha $abha, PatientRepository $patientRepo, EntityManagerInterface $entityManager): Response
{
$case = new Cases();
$role = 'recep';
$template = 'cases/recep_new.html.twig';
if ($request->getMethod() == 'GET' && $request->query->has('patient_id')) {
$patient = $patientRepo->find($this->encryptor->decrypt($request->query->get('patient_id')));
if ($patient) {
$case->setPatient($patient);
}
}
$hospital = $this->getUser()->getHospital();
if ($this->isGranted('ROLE_DOC') || $this->isGranted('ROLE_AYUSH') || $this->isGranted('ROLE_CHO') || $this->isGranted('ROLE_DENT')) {
$case->setDoctor($this->getUser());
$role = 'doc';
$template = 'cases/new.html.twig';
}
$case->setFollowUpDate(new \DateTime());
$form = $this->createForm(CaseType::class, $case, ['allow_extra_fields' => true, 'role' => $role, 'hospital' => $hospital]);
$form->handleRequest($request);
if ($case->getIsWard() && $request->isMethod('POST')) {
$getTotalBed = $caseRepo->getTotalBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
if (!empty($getTotalBed)) {
$getOccupiedBedBedData = $caseRepo->getOccupiedBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
if (!empty($getOccupiedBedBedData)) {
$totalMaleBed = $getTotalBed[0]['total_male_bed'];
$totalFemaleBed = $getTotalBed[0]['total_female_bed']; //1
$availableMaleBad = $totalMaleBed - (int) $getOccupiedBedBedData[0]['male_occupied'];
$availableFemaleBad = $totalFemaleBed - (int) $getOccupiedBedBedData[0]['female_occupied']; //0
if ($case->getPatient()->getGender() == "Male" && (empty($totalMaleBed) || empty($availableMaleBad))) {
$this->addFlash(
'danger',
'Male bed is not available.'
);
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
if ($case->getPatient()->getGender() == "Female" && (empty($totalFemaleBed) || empty($availableFemaleBad))) {
$this->addFlash(
'danger',
'Female bed is not available.'
);
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
}
} else {
$this->addFlash(
'danger',
'Bed not available.'
);
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
}
if ($form->isSubmitted() && $form->isValid()) {
$formData = $request->get('case');
$case->setHospital($hospital);
$entityManager->getConnection()->setAutoCommit(false);
$entityManager->beginTransaction();
try {
$entityManager->persist($case);
$entityManager->flush();
$hospitalId = $hospital->getId();
if (isset($formData['symptoms']) && !empty($formData['symptoms'])) {
$caseRepo->saveSymptoms($formData['symptoms'], $case);
}
if (isset($formData['ncds']) && !empty($formData['ncds'])) {
$caseRepo->saveNcds($formData['ncds'], $case);
}
$mrdNo = 'MRD-' . $hospital->getType() . '-' . date('Y') . '-' . sprintf('%04d', $hospital->getId()) . '-' . sprintf('%010d', $case->getId());
if ($role == 'doc') {
if (isset($formData['clinical_patterns']) && !empty($formData['clinical_patterns'])) {
$caseRepo->saveClinicalPatterns($formData['clinical_patterns'], $case);
}
$caseRepo->saveProvisionalExaminations($formData['provisional_examinations'], $case);
$caseRepo->saveProvisionalDiagnosis($formData['provisional_diagnosis'], $case);
if ($case->getIsLab()) {
$labTests = [];
if (isset($formData['suggestedReports']) && (is_countable($formData['suggestedReports']) ? count($formData['suggestedReports']) : 0) > 0) {
$labTests = array_merge($labTests, $formData['suggestedReports']);
}
if (isset($formData['lab_tests']) && (is_countable($formData['lab_tests']) ? count($formData['lab_tests']) : 0) > 0) {
$labTests = array_merge($labTests, $formData['lab_tests']);
}
$labTestIds = array_unique($labTests);
$radTests = $formData['generalReports'] ?? [];
if (count($labTestIds) == 0 && (is_countable($radTests) ? count($radTests) : 0) == 0) {
$entityManager->rollback();
$entityManager->clear();
$this->addFlash(
'danger',
'Please select at least one Test report and try again.'
);
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'rad_tests' => '',
'case_medicines' => '',
'case_ward_medicines' => '',
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
if (count($labTestIds) > 0) {
$caseRepo->saveLabTests($case->getId(), $hospitalId, $this->getUser()->getId(), $labTestIds);
}
if ((is_countable($radTests) ? count($radTests) : 0) > 0) {
$radTestData = [];
foreach ($radTests['id'] as $radTestId) {
$radTestData[] = [
'case_id' => $case->getId(),
'lab_test_id' => $radTestId,
'instruct' => $radTests['instruct'][$radTestId],
'hospital_id' => $hospitalId,
'created_by' => $this->getUser()->getId()
];
}
$caseRepo->saveCaseRadTests($radTestData);
}
$case->setLabTestStatus('Pending');
}
if ($case->getIsMedicine()) {
if (!isset($formData['medicines']) || (is_countable($formData['medicines']) ? count($formData['medicines']) : 0) != 6) {
$entityManager->rollback();
$entityManager->clear();
$this->addFlash(
'danger',
'Please select at least one medicine and try again.'
);
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'rad_tests' => '',
'case_medicines' => '',
'case_ward_medicines' => '',
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
$medicines = $formData['medicines'];
$medicineData = [];
foreach ($medicines['id'] as $medicineId) {
$medicineData[] = [
'case_id' => $case->getId(),
'medicine_id' => $medicineId,
'medicine_type' => $medicines['type'][$medicineId],
'dose' => $medicines['dose'][$medicineId],
'frequency' => $medicines['frequency'][$medicineId],
'num_days' => $medicines['num_days'][$medicineId],
'notes' => $medicines['patient_notes'][$medicineId],
'is_referral' => 0,
'is_opinion' => 0,
'is_rejected' => 0,
'created_by' => $this->getUser()->getId()
];
}
$caseRepo->saveCaseMedicines($medicineData);
$case->setCaseMedicineStatus('Pending');
}
if ($case->getIsReferral()) {
$isOther = $form->get('ref_type')->getData() ?: 0;
$isOpinion = $form->get('ref_is_opinion')->getData();
$refDoc = $form->get('ref_doctor')->getData();
$refEmail = $form->get('ref_email')->getData();
$refNote = $form->get('ref_note')->getData();
$caseRef = new CaseReferral();
$caseRef
->setCase($case)
->setIsOther($isOther)
->setIsOpinion($isOpinion)
->setDoctor($refDoc)
->setEmail($refEmail)
->setNotes($refNote);
if ($isOther == 1) {
$caseRef->setHospital($form->get('ref_center')->getData());
} else {
$caseRef->setHospital($hospital);
}
$entityManager->persist($caseRef);
}
if ($case->getIsWard()) {
$ward = $form->get('ward')->getData();
if (!isset($formData['ward_medicines']) || (is_countable($formData['ward_medicines']) ? count($formData['ward_medicines']) : 0) != 6 || !$ward) {
$entityManager->rollback();
$entityManager->clear();
$this->addFlash(
'danger',
'Please select at least one medicine and try again.'
);
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'rad_tests' => '',
'case_medicines' => '',
'case_ward_medicines' => '',
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
if (!$ward) {
$entityManager->rollback();
$entityManager->clear();
$this->addFlash(
'danger',
'Selected Ward is not available. Please select other Ward and try again.'
);
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'rad_tests' => '',
'case_medicines' => '',
'case_ward_medicines' => '',
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
$wardBed = new WardBed();
$wardBed
->setCase($case)
->setWard($ward)
->setStatus('Admitted');
$entityManager->persist($wardBed);
$wardMedicines = $formData['ward_medicines'];
$wardMedicineData = [];
foreach ($wardMedicines['id'] as $medicineId) {
$wardMedicineData[] = [
'case_id' => $case->getId(),
'medicine_id' => $medicineId,
'medicine_type' => $wardMedicines['type'][$medicineId],
'dose' => $wardMedicines['dose'][$medicineId],
'frequency' => $wardMedicines['frequency'][$medicineId],
'num_days' => $wardMedicines['num_days'][$medicineId],
'notes' => $wardMedicines['staff_notes'][$medicineId],
'is_emergency' => 0,
'has_stock' => 0,
'created_by' => $this->getUser()->getId()
];
}
//TODO when isWard is true then ward medicine status is pending so pharmacy can give medicine to patient
$case->setWardMedicineStatus('Pending');
$caseRepo->saveCaseWardMedicines($wardMedicineData);
}
if ($case->getPatient()->getMobile()) {
try {
$client = HttpClient::create();
$client->request('POST', 'https://staging-abdm.7mantra.in/m2/sms-notify2', [
'headers' => [
'Content-Type' => 'application/json'
],
'json' => [
'mobile_number' => $case->getPatient()->getMobile(),
'hip_id' => $this->getUser()->getProfile()->getHospital()->getHIPCode(),
'hip_name' => $this->getUser()->getProfile()->getHospital()->getHIPName()
]
]);
} catch (\Exception) {
$this->addFlash(
'danger',
'Sms not sent.'
);
}
}
if ($case->getPatient()->getHealthAddress()) {
$data['abhaAddress'] = $case->getPatient()->getHealthAddress();
$data['patientRefNo'] = $case->getPatient()->getUhId();
$data['hipId'] = $case->getPatient()->getHospital()->getHIPCode();
$data['contextRef'] = $mrdNo;
$data['contextDisplay'] = 'Case Care Context';
$data['hiTypes'] = 'OPConsultation';
$data['reqId'] = $abha->GUID();
$caseRepo->saveContextDetails($data);
}
}
$case->setMrdId($mrdNo);
$entityManager->persist($case);
$entityManager->flush();
$entityManager->commit();
$this->addFlash(
'success',
'New case added successfully!'
);
return $this->redirectToRoute('case_index');
} catch (\Exception) {
$entityManager->rollback();
$entityManager->clear();
$this->addFlash(
'danger',
'Something went wrong! Case data could not be saved. Please try again.'
);
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'rad_tests' => '',
'case_medicines' => '',
'case_ward_medicines' => '',
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
}
return $this->renderForm($template, [
'case' => $case,
'form' => $form,
'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [],
'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : []
]);
}
#[Route(path: '/re-open/{id}', name: 'case_reopen', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function reOpen(Cases $case, EntityManagerInterface $entityManager): Response
{
if ($this->getUser()->getHospital()->getId() != $case->getHospital()->getId()) {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
if (!$case->getIsClosed()) {
$this->addFlash(
'danger',
'Case is not closed yet!'
);
return $this->redirectToRoute('case_index');
}
$reOpened = new Cases();
$reOpened
->setHospital($case->getHospital())
->setDoctor($case->getDoctor())
->setPatient($case->getPatient())
->setPatientCategory($case->getPatientCategory())
->setFamilyHistory($case->getFamilyHistory() ?: '')
->setMedicalHistory($case->getMedicalHistory() ?: '')
->setMedicineHistory($case->getMedicalHistory() ?: '')
->setCurrentDiseaseHistory($case->getCurrentDiseaseHistory() ?: '')
->setDiseaseCategory($case->getDiseaseCategory())
->setPrevCase($case);
$entityManager->persist($reOpened);
$entityManager->flush();
$reOpened->setMrdId('MRD-' . $case->getHospital()->getType() . '-' . date('Y') . '-' . sprintf('%010d', $reOpened->getId()));
$entityManager->persist($reOpened);
$entityManager->flush();
$case->setIsReopened(true);
$entityManager->persist($case);
$entityManager->flush();
$this->addFlash(
'success',
'Case re-opened successfully!'
);
return $this->redirectToRoute('case_index');
}
#[Route(path: '/view/{id}', name: 'case_show', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function show(Request $request, Cases $case, CaseRepository $caseRepo): Response
{
if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId() && $case->getIsopinion() !== true) {
$symptoms = $caseRepo->getCaseSymptoms($case->getId());
$ncds = $caseRepo->getCaseNcds($case->getId());
$provisionalExaminations = $caseRepo->getCaseProvisionalExaminations($case->getId());
$provisionalDiagnosis = $caseRepo->getCaseProvisionalDiagnosis($case->getId());
$clinicalPatterns = $caseRepo->getCaseClinicalPatterns($case->getId());
return $this->render('cases/show.html.twig', [
'case' => $case,
'case_tests' => $caseRepo->getCaseTests($case->getId()),
'case_medicines' => $caseRepo->getCaseMedicines($case->getId()),
'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
'referrals' => $caseRepo->getCaseReferrals($case->getId()),
'symptoms' => $symptoms ? implode(', ', $symptoms) : '—',
'ncds' => $ncds ? implode(', ', $ncds) : '—',
'provisional_diagnosis' => $provisionalDiagnosis ? implode(', ', $provisionalDiagnosis) : '—',
'provisional_examinations' => $provisionalExaminations ? implode(', ', $provisionalExaminations) : '—',
'clinical_patterns' => $clinicalPatterns ? implode(', ', $clinicalPatterns) : '—',
'case_ward_medicines' => $caseRepo->getCaseWardMedicines($case->getId()),
'ward_type' => $caseRepo->getWardType($case->getId()),
'ward_bed_num' => $caseRepo->getWardBedNum($case->getId()),
'discharge_note' => $caseRepo->getDischargeNote($case->getId()),
'history' => $caseRepo->getCaseHistory($case->getId())
]);
} else {
return $this->redirectToRoute('case_index');
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
#[Route(path: '/diagnose/{id}', name: 'case_edit', methods: ['GET', 'POST'])]
#[ParamDecryptor(["id"])]
#[Security("is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_AYUSH') or is_granted('ROLE_DENT')")]
public function diagnose(Request $request, Cases $case, CaseRepository $caseRepo, EntityManagerInterface $entityManager, TBRegisterRepository $tbRegRepo, HivRegisterRepository $hivRegRepo): Response
{
if ($request->isMethod('GET') || $request->isMethod('POST') && $this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
$caseTests = $caseRepo->getCaseTests($case->getId());
$radTests = $caseRepo->getCaseRadTests($case->getId());
$caseMedicines = $caseRepo->getCaseMedicines($case->getId());
$caseWardMedicines = $caseRepo->getCaseWardMedicines($case->getId());
$form = $this->createForm(CaseType::class, $case, ['allow_extra_fields' => true, 'role' => 'doc', 'hospital' => $case->getHospital()]);
$form->handleRequest($request);
if ($case->getIsWard() && $request->isMethod('POST')) {
$getTotalBed = $caseRepo->getTotalBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
if (!empty($getTotalBed)) {
$getOccupiedBedBedData = $caseRepo->getOccupiedBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
if (!empty($getOccupiedBedBedData)) {
$totalMaleBed = $getTotalBed[0]['total_male_bed'];
$totalFemaleBed = $getTotalBed[0]['total_female_bed']; //1
$availableMaleBad = $totalMaleBed - (int) $getOccupiedBedBedData[0]['male_occupied'];
$availableFemaleBad = $totalFemaleBed - (int) $getOccupiedBedBedData[0]['female_occupied']; //0
if ($case->getPatient()->getGender() == "Male" && (empty($totalMaleBed) || empty($availableMaleBad))) {
$this->addFlash(
'danger',
'Male bed is not available.'
);
return $this->renderForm('cases/edit.html.twig', [
'case' => $case,
'form' => $form,
'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
'general_reports' => $caseRepo->getGeneralReports(),
'rad_tests' => $radTests,
'case_tests' => $caseTests,
'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
'case_medicines' => $caseMedicines,
'case_ward_medicines' => $caseWardMedicines,
'history' => $caseRepo->getCaseHistory($case->getId())
]);
}
if ($case->getPatient()->getGender() == "Female" && (empty($totalFemaleBed) || empty($availableFemaleBad))) {
$this->addFlash(
'danger',
'Female bed is not available.'
);
return $this->renderForm('cases/edit.html.twig', [
'case' => $case,
'form' => $form,
'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
'general_reports' => $caseRepo->getGeneralReports(),
'rad_tests' => $radTests,
'case_tests' => $caseTests,
'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
'case_medicines' => $caseMedicines,
'case_ward_medicines' => $caseWardMedicines,
'history' => $caseRepo->getCaseHistory($case->getId())
]);
}
}
} else {
$this->addFlash(
'danger',
'Bed not available.'
);
return $this->renderForm('cases/edit.html.twig', [
'case' => $case,
'form' => $form,
'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
'general_reports' => $caseRepo->getGeneralReports(),
'rad_tests' => $radTests,
'case_tests' => $caseTests,
'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
'case_medicines' => $caseMedicines,
'case_ward_medicines' => $caseWardMedicines,
'history' => $caseRepo->getCaseHistory($case->getId())
]);
}
}
if ($form->isSubmitted() && $form->isValid()) {
$formData = $request->request->get('case');
if ($caseTests || $radTests) {
$case->setIsLab(true);
}
if ($caseMedicines) {
$case->setIsMedicine(true);
}
if ($caseWardMedicines) {
$case->setIsWard(true);
}
$entityManager->getConnection()->setAutoCommit(false);
$entityManager->beginTransaction();
try {
$entityManager->flush();
$history = new CaseHistory();
$history
->setCase($case)
->setDoctor($case->getDoctor())
->setDiseaseCategory($case->getDiseaseCategory())
->setLocalExamination($case->getLocalExamination());
if ($case->getIcd10CauseGroup()) {
$history->setIcd10Group($case->getIcd10CauseGroup()->getName());
}
if ($case->getIcd10CauseSubGroup()) {
$history->setIcd10Subgroup($case->getIcd10CauseSubGroup()->getName());
}
if ($case->getIcd10Disease()) {
$history->setIcd10Diagnosis($case->getIcd10Disease()->getName());
}
$caseRepo->deleteExistingSymptoms($case);
$caseRepo->deleteExistingProvisionalExaminations($case);
$caseRepo->deleteExistingProvisionalDiagnosis($case);
if (isset($formData['clinical_patterns']) && !empty($formData['clinical_patterns'])) {
$caseRepo->deleteExistingClinicalPatterns($case);
$caseRepo->saveClinicalPatterns((array)$formData['clinical_patterns'], $case, $history);
}
if (isset($formData['ncds']) && !empty($formData['ncds'])) {
$caseRepo->deleteExistingNcds($case);
$caseRepo->saveNcds((array)$formData['ncds'], $case, $history);
}
$caseRepo->saveSymptoms((array)$formData['symptoms'], $case, $history);
$caseRepo->saveProvisionalExaminations((array)$formData['provisional_examinations'], $case, $history);
$caseRepo->saveProvisionalDiagnosis((array)$formData['provisional_diagnosis'], $case, $history);
if ($case->getIsLab()) {
$hospitalId = $case->getHospital()->getId();
$labTests = [];
if (isset($formData['suggestedReports']) && count((array)$formData['suggestedReports']) > 0) {
$labTests = array_merge($labTests, $formData['suggestedReports']);
}
if (isset($formData['lab_tests']) && count((array)$formData['lab_tests']) > 0) {
$labTests = array_merge($labTests, $formData['lab_tests']);
}
$testIdsForHistory = $labTestIds = array_unique($labTests);
if (count($labTestIds) > 0) {
$caseRepo->saveLabTests($case->getId(), $hospitalId, $this->getUser()->getId(), $labTestIds);
$case->setLabTestStatus('Pending');
}
$radTests = $formData['generalReports'] ?? [];
if (count($radTests) > 0) {
$radTestData = [];
foreach ($radTests['id'] as $radTestId) {
$radTestData[] = [
'case_id' => $case->getId(),
'lab_test_id' => $radTestId,
'instruct' => $radTests['instruct'][$radTestId],
'hospital_id' => $hospitalId,
'created_by' => $this->getUser()->getId()
];
}
$caseRepo->saveCaseRadTests($radTestData);
$case->setLabTestStatus('Pending');
$testIdsForHistory = array_merge($testIdsForHistory, $radTests['id']);
}
$testsForHistory = $caseRepo->getLabTestNames($testIdsForHistory);
$history->setLabTests(implode(', ', $testsForHistory));
}
if ($case->getIsMedicine()) {
if (isset($formData['medicines']) && count((array)$formData['medicines']) == 6) {
$medicines = $formData['medicines'];
$medicineData = [];
foreach ((array)$medicines['id'] as $medicineId) {
$medicineData[] = [
'case_id' => $case->getId(),
'medicine_id' => $medicineId,
'medicine_type' => $medicines['type'][$medicineId],
'dose' => $medicines['dose'][$medicineId],
'frequency' => $medicines['frequency'][$medicineId],
'num_days' => $medicines['num_days'][$medicineId],
'notes' => $medicines['patient_notes'][$medicineId],
'is_referral' => 0,
'is_opinion' => 0,
'is_rejected' => 0,
'created_by' => $this->getUser()->getId()
];
}
$caseRepo->saveCaseMedicines($medicineData);
$case->setCaseMedicineStatus('Pending');
$medsForHistory = $caseRepo->getMedicineNames($medicines['id']);
$history->setMedicines(implode(', ', $medsForHistory));
}
}
if (($case->getIsReferral() || $case->getIsOpinion()) && $form->get('ref_doctor')->getData()) {
$isOther = $form->get('ref_type')->getData() ?: 0;
$isOpinion = $case->getIsOpinion();
$refDoc = $form->get('ref_doctor')->getData();
$refEmail = $form->get('ref_email')->getData();
$refNote = $form->get('ref_note')->getData();
$caseRef = new CaseReferral();
$caseRef
->setCase($case)
->setIsOther($isOther)
->setIsOpinion($isOpinion)
->setDoctor($refDoc)
->setEmail($refEmail)
->setNotes($refNote);
if ($isOther == 1) {
$caseRef->setHospital($form->get('ref_center')->getData());
} else {
$caseRef->setHospital($case->getHospital());
}
$entityManager->persist($caseRef);
}
if ($case->getIsWard()) {
$ward = $form->get('ward')->getData();
$wardBed = $case->getWardBed();
if (!$wardBed) {
if ($ward) {
$wardBed = new WardBed();
$wardBed
->setCase($case)
->setWard($ward)
->setStatus('Admitted');
$entityManager->persist($wardBed);
}
} else {
if ($wardBed && $ward) {
$wardBed->setWard($ward);
$entityManager->persist($wardBed);
}
}
if (isset($formData['ward_medicines']) && count((array)$formData['ward_medicines']) == 6) {
$wardMedicines = $formData['ward_medicines'];
$wardMedicineData = [];
foreach ((array)$wardMedicines['id'] as $medicineId) {
$wardMedicineData[] = [
'case_id' => $case->getId(),
'medicine_id' => $medicineId,
'medicine_type' => $wardMedicines['type'][$medicineId],
'dose' => $wardMedicines['dose'][$medicineId],
'frequency' => $wardMedicines['frequency'][$medicineId],
'num_days' => $wardMedicines['num_days'][$medicineId],
'notes' => $wardMedicines['staff_notes'][$medicineId],
'is_emergency' => 0,
'has_stock' => 0,
'created_by' => $this->getUser()->getId()
];
}
$case->setWardMedicineStatus("Pending");
$caseRepo->saveCaseWardMedicines($wardMedicineData);
$wardMedsForHistory = $caseRepo->getMedicineNames($wardMedicines['id']);
$history->setWardMedicines(implode(', ', $wardMedsForHistory));
}
} else {
$ward = $form->get('ward')->getData();
$wardBed = $case->getWardBed();
if ($wardBed) {
if ($ward) {
$caseRepo->UpdateStatus($case->getId(), $ward->getId());
}
}
}
if ($case->getIsClosed() && $case->getClosureReason() == 'Death of patient') {
$patient = $case->getPatient();
$patient
->setIsAlive(false)
->setExpiredAt(new \DateTime());
$entityManager->persist($patient);
}
$entityManager->persist($history);
$entityManager->flush();
if ($caseRepo->hasTB($case->getId())) {
$tbReg = $tbRegRepo->findOneBy(['hospital' => $case->getHospital(), 'patient' => $case->getPatient()]);
if (!$tbReg) {
$tbReg = new TBRegister();
$tbTest = $caseRepo->getTBTestDetails($case->getId());
$pds = $case->getProvisionalDiagnosis()->filter(fn ($pd) => in_array($pd->getName(), ['PTB', 'RE', 'NTM']));
$tbReg
->setPatient($case->getPatient())
->setLabSerialNum($tbTest['number'] ?? '-')
->setDateCollected(isset($tbTest['date_collected']) ? new \DateTime($tbTest['date_collected']) : new \DateTime())
->setRefFacility($case->getHospital()->getName())
->setPresumptive(isset($pds[0]) ? $pds[0]->getName() : '-')
->setPredominant($case->getCurrentDiseaseHistory())
->setSpecimenType($tbTest['type'] ?? '-')
->setTestMethod($tbTest['method'] ?? '-')
->setResultA($tbTest['result'] ?? '-')
->setResultB('-')
->setResultADate(isset($tbTest['result_date']) ? new \DateTime($tbTest['result_date']) : new \DateTime())
->setHospital($case->getHospital())
->setIsDiabeties($caseRepo->hasDM($case->getId()));
$entityManager->persist($tbReg);
$entityManager->flush();
}
}
if ($caseRepo->hasHIV($case->getId())) {
$hivReg = $hivRegRepo->findOneBy(['case' => $case]);
if (!$hivReg) {
$hivReg = new HivRegister();
$hivReg->setCase($case);
$entityManager->persist($hivReg);
$entityManager->flush();
}
}
$entityManager->commit();
$this->addFlash(
'success',
'Case updated successfully!'
);
return $this->redirectToRoute('case_index');
} catch (\Exception) {
$entityManager->rollback();
$entityManager->clear();
$this->addFlash(
'danger',
'Something went wrong! Case data could not be saved. Please try again.'
);
return $this->redirectToRoute('case_edit', ['id' => $this->encryptor->encrypt($case->getId())]);
}
}
return $this->renderForm('cases/edit.html.twig', [
'case' => $case,
'form' => $form,
'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
'general_reports' => $caseRepo->getGeneralReports(),
'rad_tests' => $radTests,
'case_tests' => $caseTests,
'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
'case_medicines' => $caseMedicines,
'case_ward_medicines' => $caseWardMedicines,
'history' => $caseRepo->getCaseHistory($case->getId())
]);
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
#[Route(path: '/delete/{id}', name: 'case_delete', methods: ['GET']), IsGranted(data: 'ROLE_HOSP_ADMIN')]
#[ParamDecryptor(["id"])]
public function delete(Cases $case, EntityManagerInterface $entityManager): Response
{
if ($this->getUser()->getHospital()->getId() != $case->getHospital()->getId()) {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
try {
$entityManager->remove($case);
$entityManager->flush();
$this->addFlash(
'success',
'Case deleted successfully!'
);
} catch (\Exception) {
$this->addFlash(
'danger',
'Something went wrong! The case could not be deleted!'
);
}
return $this->redirectToRoute('case_index');
}
#[Route(path: '/symptoms', name: 'case_symptom_json', methods: ['GET'])]
public function symptoms(Request $request, CaseRepository $caseRepo): JsonResponse
{
$categoryId = $request->query->get('category_id');
$symptoms = $caseRepo->getSymptoms($categoryId);
return $this->json($symptoms);
}
#[Route(path: '/diagnosis-data', name: 'case_diagnosis_data_json', methods: ['GET'])]
public function clinicalPatterns(Request $request, CaseRepository $caseRepo): JsonResponse
{
$symptomIds = $request->query->get('symptom_ids');
$data = [
'clinicalPatterns' => null,
'provisionalExaminations' => null,
'provisionalDiagnosis' => null
];
if (is_array($symptomIds)) {
$data['clinicalPatterns'] = $caseRepo->getClinicalPatternsBySymptomId($symptomIds);
$data['provisionalExaminations'] = $caseRepo->getProvisionalExaminationsBySymptomId($symptomIds);
$data['provisionalDiagnosis'] = $caseRepo->getProvisionalDiagnosisBySymptomId($symptomIds);
}
return $this->json($data);
}
#[Route(path: '/suggested-tests', name: 'case_suggested_tests_json', methods: ['GET'])]
public function suggestedTests(Request $request, CaseRepository $caseRepo): JsonResponse
{
$icd10SubGroupId = $request->query->get('icd10_sub_group_id');
$tests = $caseRepo->getSuggestedTests($icd10SubGroupId);
return $this->json($tests);
}
#[Route(path: '/suggested-advice-treatment', name: 'case_suggested_advice_treatment_json', methods: ['GET'])]
public function suggestedAdviceTreatment(Request $request, CaseRepository $caseRepo): JsonResponse
{
$icd10DiseaseId = $request->query->get('icd10_disease_id');
$adviceTreatment = $caseRepo->getSuggestedAdviceTreatment($icd10DiseaseId);
return $this->json($adviceTreatment);
}
#[Route(path: '/delete-case-medicine', name: 'case_delete_case_medicine_json', methods: ['GET'])]
public function removeCaseMedicine(Request $request, CaseRepository $caseRepo): JsonResponse
{
$caseMedicineId = $request->query->get('case_medicine_id');
$caseRepo->deleteCaseMedicine($caseMedicineId);
return $this->json(true);
}
#[Route(path: '/reject-case-medicine/{id}', name: 'case_reject_case_medicine', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function rejectCaseMedicine(CaseMedicine $caseMedicine, EntityManagerInterface $entityManager): Response
{
if ($this->getUser()->getHospital()->getId() != $caseMedicine->getHospital()->getId()) {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
$caseMedicine->setIsRejected(true);
$entityManager->persist($caseMedicine);
$entityManager->flush();
$this->addFlash(
'success',
'Medicine rejected successfully!'
);
return $this->redirectToRoute('case_index');
}
#[Route(path: '/delete-case-ward-medicine/{id}', name: 'case_delete_case_ward_medicine_json', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function removeCaseWardMedicine(int $id, CaseRepository $caseRepo): JsonResponse
{
$caseRepo->deleteCaseWardMedicine($id);
return $this->json(true);
}
#[Route(path: '/print-history/{id}', name: 'case_history_print', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function printHistory(Cases $case, CaseRepository $caseRepo)
{
return $this->render('cases/history_print.html.twig', [
'case' => $case,
'history' => $caseRepo->getCaseHistory($case->getId())
]);
}
#[Route(path: '/mlc-info-letter/{id}', name: 'case_mlc_info_letter', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function mlcInfoLetter(Cases $case)
{
return $this->render('cases/mlc_info_letter.html.twig', [
'case' => $case
]);
}
/*Start :: abha verify and add context */
/**
* LINK AND ADD CONTEXT (M1)
*/
#[Route('/abha-link-case/{id}', name: 'abha_link_case', methods: ['GET', 'POST'])]
#[ParamDecryptor(["id"])]
public function abhaLink(Cases $case, Request $request): Response
{
if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId())
{
$session = $request->getSession();
$patientId = $case->getPatient()->getId();
$caseId = $case->getMrdId();
$uhId = $case->getPatient()->getUhId();
$type = $request->request->get('type');
$session->set('patient_id', $patientId);
$session->set('uh_id', $uhId);
$session->set('case_number', $caseId);
$abhaDetail = $request->request->get('abha_details') ? $request->request->get('abha_details') : '';
/* $abhaDetail = $request->request->get('abha_detail');
if (!$abhaDetail || !ctype_digit($abhaDetail) || strlen($abhaDetail) != 6) {
$this->addFlash(
'danger',
'Please enter valid abha number/abha address.'
);
} */
$readOnly = '';
if ($abhaDetail != '') {
$readOnly = "readonly";
}
return $this->render('cases/link_step1.html.twig', [
'type' => $type,
'case' => $case,
'readOnly' => $readOnly,
'abhaDetail' => $abhaDetail,
]);
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
/**
* LINK AND ADD CONTEXT (M1)
*/
#[Route('/post-abha-link', name: 'post_abha_link_case', methods: ['GET', 'POST'])]
public function postAbhaLink(Request $request, PatientRepository $patientRepo): Response
{
$session = $request->getSession();
if ($request->isMethod('POST')) {
$healthAddress = $request->request->get('abha_details');
if (!$healthAddress) {
return $this->redirectToRoute('case_index');
}
//TODO :: health address store in session
$session->set('health_address', $healthAddress);
//define hip code and get code from hospital table
$hipCode = $this->getUser()->getProfile()->getHospital()->getHIPCode();
//try {
$payload = [
'id' => $healthAddress,
'hip_id' => $hipCode
];
$url = 'https://staging-abdm.7mantra.in/data-link/fetch-modes';
$patientRepo->insertPayload($payload, $url);
$client = HttpClient::create();
$response = $client->request('POST', $url, [
'headers' => [
'Content-Type' => 'application/json',
],
'json' => $payload
]);
$statusCode = $response->getStatusCode();
$content = json_decode($response->getContent(), true);
if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') {
$message = $content['message'];
if ($statusCode == '422') {
$message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
}
$this->addFlash(
'danger',
$message
);
return $this->redirectToRoute('fetch_mode');
} elseif ($statusCode == '202') {
if (isset($content['message'])) {
$this->addFlash(
'danger',
$content['message']
);
return $this->redirectToRoute('fetch_mode');
}
return $this->render('cases/fetch-modes.html.twig', [
'type' => 'case_diagnose',
'modesArr' => $content,
'health_address' => $healthAddress
]);
} else {
return $this->redirectToRoute('case_index'); // redirect to search abha
}
}
}
/**
* LINK HEALTH RECORD FETCH MODE (M2)
*/
#[Route(path: '/post-fetch-modes', name: 'post_fetch_modes_case', methods: ['GET', 'POST'])]
public function postFetchModes(Request $request, PatientRepository $patientRepo): Response
{
$fetchMode = $request->request->get('fetch_mode');
$healthAddress = $request->request->get('health_address');
$type = $request->request->get('type');
if (!$fetchMode || !$healthAddress || !$type) {
$this->addFlash(
'danger',
'please enter valid details'
);
return $this->render('cases/fetch-modes.html.twig', [
'modes' => $fetchMode,
'modesArr' => $type,
'health_address' => $healthAddress,
]);
}
$session = $request->getSession();
$patientId = $session->get('patient_id');
$patientDetail = $patientRepo->getPatientById($patientId);
$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'] : '';
$patientArr['gender'] = isset($patientDetail[0]) && $patientDetail[0]['gender'] ? $patientDetail[0]['gender'] : '';
$patientArr['dob'] = isset($patientDetail[0]) && $patientDetail[0]['dob'] ? $patientDetail[0]['dob'] : '';
$patientArr['mobile'] = isset($patientDetail[0]) && $patientDetail[0]['mobile'] ? $patientDetail[0]['mobile'] : '';
//try {
//define hip code and get code from hospital table
$hipCode = $this->getUser()->getProfile()->getHospital()->getHIPCode();
$payload = [
'id' => $healthAddress,
'hip_id' => $hipCode,
'auth_mode' => $fetchMode,
];
$url = 'https://sttaging-abdm.7mantra.in/data-link/init';
$patientRepo->insertPayload($payload, $url);
$client = HttpClient::create();
$header = [
'Content-Type' => 'application/json',
];
$response = $client->request('POST', $url, [
'headers' => $header,
'json' => $payload
]);
$statusCode = $response->getStatusCode();
$content = json_decode($response->getContent(), true);
if ($statusCode == '202') { //if api success, get tnx id
if (isset($content['message'])) {
$this->addFlash(
'danger',
$content['message']
);
return $this->render('cases/fetch-modes.html.twig', [
'modes' => $fetchMode,
'modesArr' => $type,
'health_address' => $healthAddress,
]);
}
$txnId = isset($content['txn_id']) ? $content['txn_id'] : '';
return $this->render('cases/verify_data_link.html.twig', [
'modes' => $fetchMode,
'type' => $type,
'txn_id' => $txnId,
'health_address' => $healthAddress,
'patientArr' => $patientArr
]);
} elseif ($statusCode == '400' || $statusCode == '401' || $statusCode == '422' || $statusCode == '500') {
//if api get error
$message = $content['message'];
if ($statusCode == '422') {
$message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
}
$this->addFlash(
'danger',
$message
);
return $this->render('cases/fetch-modes.html.twig', [
'modes' => $fetchMode,
'modesArr' => $type,
'health_address' => $healthAddress,
]);
//return $this->redirectToRoute('patient_search_with_abha'
} else {
return $this->redirectToRoute('case_index');
}
/* } catch (\Throwable $th) {
$this->addFlash(
'danger',
'Something went wrong please try again.'
);
return $this->redirectToRoute('case_index');
} */
}
/**
* LINK HEALTH RECORD VERIFY DETAILS (M2)
*/
#[Route(path: '/link-verify-details', name: 'link_verify_details', methods: ['GET', 'POST'])]
public function linkVerifyDetails(Request $request, PatientRepository $patientRepo): Response
{
$session = $request->getSession();
$modes = $request->request->get('modes');
$healthAddress = $request->request->get('health_address');
$name = $request->request->get('name');
$gender = $request->request->get('gender');
$dob = $request->request->get('dob');
$mobile = $request->request->get('mobile');
$type = $request->request->get('type');
$txnId = $request->request->get('txn_id');
$auth_code = $request->request->get('otp');
if (!$healthAddress || !$type || !$txnId || !$modes) {
$this->addFlash(
'danger',
'please enter valid details'
);
return $this->redirectToRoute('case_index');
} else if (($modes == 'MOBILE_OTP' || $modes == 'AADHAAR_OTP') && !$auth_code && strlen($auth_code) != 6) {
$this->addFlash(
'danger',
'please enter valid details'
);
return $this->redirectToRoute('case_index');
} else if ($modes == 'DEMOGRAPHICS' && (!$name || !$gender || !$dob)) {
$this->addFlash(
'danger',
'please enter valid details'
);
return $this->redirectToRoute('case_index');
}
if ($modes == 'MOBILE_OTP' || $modes == 'AADHAAR_OTP') {
$payload = [
'transaction_id' => $txnId,
'modes' => $modes,
'auth_code' => $auth_code
];
} else {
$payload = [
'transaction_id' => $txnId,
'modes' => $modes,
'name' => $name,
'gender' => $gender,
'dob' => $dob,
'mobile' => $mobile,
];
}
//try {
$header = [
'Content-Type' => 'application/json',
];
$url = 'https://staging-abdm.7mantra.in/data-link/confirm';
$patientRepo->insertPayload($payload, $url);
$client = HttpClient::create();
$response = $client->request('POST', $url, [
'headers' => $header,
'json' => $payload
]);
$statusCode = $response->getStatusCode();
$content = json_decode($response->getContent(), true);
if ($statusCode == '400' || $statusCode == '401' || $statusCode == '422' || $statusCode == '500') {
$message = $content['message'];
if ($statusCode == '422') {
$message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
}
$this->addFlash(
'danger',
$message
);
return $this->redirectToRoute('case_index');
} else if ($statusCode == '202') {
if (isset($content['message']) && empty($content)) { // changes ||
$this->addFlash(
'danger',
$content['message']
);
return $this->redirectToRoute('case_index');
}
$contentArr['token'] = $content['token'];
$contentArr['firstName'] = $content['first_name'];
$contentArr['middleName'] = $content['middle_name'];
$contentArr['lastName'] = $content['last_name'];
//$contentArr['yearOfBirth'] = date('Y-m-d', strtotime($content['dob']));
$contentArr['dob'] = date('Y-m-d', strtotime($content['dob']));
$contentArr['gender'] = $content['gender'];
$contentArr['mobile'] = isset($content['identifiers']['mobile']) ? $content['identifiers']['mobile'] : '';
$contentArr['healthIdNumber'] = isset($content['identifiers']['health_number']) ? $content['identifiers']['health_number'] : '';
$contentArr['healthIdAddress'] = $content['id'];
if ($type == 'case_diagnose') {
$patientId = $session->get('patient_id'); // get patient id in session
//force fully update details and redirect to relative patient
$contextStatus = '';
if (isset($content['token']) && !empty($content['token'])) {
if (empty($contentArr['healthIdNumber']) || empty($contentArr['healthIdAddress'])) {
$getTokenData = (array) json_decode(base64_decode(str_replace('_', '/', str_replace('-', '+', explode('.', $content['token'])[1]))));
$contentArr['healthIdNumber'] = isset($getTokenData['healthIdNumber']) ? $content['healthIdNumber'] : '';
$contentArr['healthIdAddress'] = isset($getTokenData['healthId']) ? $content['healthId'] : '';
}
$patientRepo->updateAbhaDetails($contentArr, $patientId);
//TODO :: All value set dynamic, case and patient table
$patientReference = $session->get('uh_id');
$caseNumber = $session->get('case_number');
// TODO : set payload dynamic {type= case,id=caseId,token=token}
$careContext[] = ['referenceNumber' => $caseNumber, 'display' => 'Case Care Context'];
$type = 'OPConsultation';
$patientDisplay = 'patient display';
//define hip code and get code from hospital table
$hipId = $this->getUser()->getProfile()->getHospital()->getHIPCode();
$addContextPayload = [
'accessToken' => $content['token'],
'patientReference' => $patientReference,
'display' => $patientDisplay,
'careContexts' => $careContext,
'healthAddress' => $healthAddress,
'type' => $type,
'hip_id' => $hipId
];
$url = 'https://staging-abdm.7mantra.in/m2/add-context';
$patientRepo->insertPayload($addContextPayload, $url);
$client = HttpClient::create();
$contextResponse = $client->request('POST', $url, [
'headers' => $header,
'json' => $addContextPayload
]);
$contextStatus = $contextResponse->getStatusCode();
}
if ($contextStatus == '202') {
$this->addFlash(
'success',
'Health data link successfully.'
);
} else if ($contextStatus == '400') {
$this->addFlash(
'danger',
'Bad request.'
);
} else if ($contextStatus == '422') {
$this->addFlash(
'danger',
'Some of the Care Contexts are already linked, please remove the linked Care Contexts.'
);
} else {
$this->addFlash(
'danger',
'Something went wrong! Please try again!'
);
}
$session->remove('patient_id');
$session->remove('health_address');
$session->remove('uh_id');
$session->remove('case_number');
return $this->redirectToRoute('case_index');
}
} else {
$this->addFlash(
'danger',
'Something went wrong. Please try again.'
);
return $this->redirectToRoute('case_index');
}
/* } catch (\Throwable $th) {
$this->addFlash(
'danger',
'Something went wrong please try again.'
);
return $this->redirectToRoute('case_index');
} */
}
/*END :: abha verify and add context */
/**
* LINK HEALTH RECORD (M2)
*/
#[Route(path: '/data-link-fetch/{id}', name: 'data_link_fetch', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function dataLinkFetch(Cases $case, Request $request, PatientRepository $patientRepo): Response
{
if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
//TODO :: {{base url}}/v0.5/users/auth/init call this api
//TODO :: get health address from patient table
//$case->getPatient()->getMobile();
$healthAddress = $case->getPatient()->getHealthAddress();
if (!$healthAddress) {
$this->addFlash(
'danger',
'Invalid request.'
);
return $this->redirectToRoute('case_index');
}
$patientId = $case->getPatient()->getId();
$caseId = $case->getMrdId();
$session = $request->getSession();
$uhId = $case->getPatient()->getUhId();
$session->set('patient_id', $patientId);
$session->set('uh_id', $uhId);
// get Case id in store session
$session->set('case_number', $caseId);
//TODO :: health address store in session
$session->set('health_address', $healthAddress);
//define hip code and get code from hospital table
$hipCode = $this->getUser()->getProfile()->getHospital()->getHIPCode();
//try {
$payload = [
'id' => $healthAddress,
'hip_id' => $hipCode
];
$url = 'https://staging-abdm.7mantra.in/data-link/fetch-modes';
$patientRepo->insertPayload($payload, $url);
$client = HttpClient::create();
$response = $client->request('POST', $url, [
'headers' => [
'Content-Type' => 'application/json',
],
'json' => $payload
]);
$statusCode = $response->getStatusCode();
$content = json_decode($response->getContent(), true);
if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') {
$message = $content['message'];
if ($statusCode == '422') {
$message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
}
$this->addFlash(
'danger',
$message
);
return $this->redirectToRoute('fetch_mode');
} elseif ($statusCode == '202') {
if (isset($content['message'])) {
$this->addFlash(
'danger',
$content['message']
);
return $this->redirectToRoute('fetch_mode');
}
if (empty($content)) {
return $this->redirectToRoute('case_index');
}
return $this->render('cases/fetch-modes.html.twig', [
'type' => 'case_diagnose',
'modesArr' => $content,
'health_address' => $healthAddress
]);
} else {
return $this->redirectToRoute('case_index'); // redirect to search abha
}
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
/**
* M2 SMS NOTIFY
*/
#[Route(path: '/patient-notify/{id}', name: 'patient_notify', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function patientNotify(Cases $case, PatientRepository $patientRepo): Response
{
if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
//TODO :: get mobile number related patient
//TODO :: {{base url}}/v0.5/users/auth/init call this api
//TODO :: add try catch
$patientMobileNumber = $case->getPatient()->getMobile();
if (!$patientMobileNumber) {
$this->addFlash(
'danger',
'Invalid request.'
);
return $this->redirectToRoute('case_index');
}
$payload = [
'mobile_number' => $patientMobileNumber,
'hip_id' => $this->getUser()->getProfile()->getHospital()->getHIPCode(),
'hip_name' => $this->getUser()->getProfile()->getHospital()->getHIPName()
];
$url = 'https://staging-abdm.7mantra.in/m2/sms-notify2';
$patientRepo->insertPayload($payload, $url);
$client = HttpClient::create();
$response = $client->request('POST', $url, [
'headers' => [
'Content-Type' => 'application/json'
],
'json' => $payload
]);
$status = $response->getStatusCode();
if ($status == '202') {
$this->addFlash(
'success',
'Message sent successfully.'
);
} else if ($status == '400') {
$this->addFlash(
'danger',
'Mobile number required.'
);
} else {
$this->addFlash(
'danger',
'Something went wrong! Please try again!'
);
}
return $this->redirectToRoute('case_index');
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
/**
* CONSENT LIST (M3)
*/
#[Route(path: '/consent/{id}', name: 'consent', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function consent(Request $request, Abha $abha): Response
{
// cross site script
$id = $this->encryptor->encrypt($request->attributes->get('id'));
$arrData = $abha->getConsentList();
$uri = $this->generateUrl('consent_req_form', ['id' => $id]);
// dd($arrData,$uri);
return $this->render('abha/consent.html.twig', [
'consents' => $arrData,
'form_url' => $uri,
'data_request' => 'data_request',
'view_data' => 'view_data'
]);
}
/**
* CONSENT REQUEST FORM (M3)
*/
#[Route(path: '/consent-request/{id}', name: 'consent_req_form', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function consentForm(Request $request, Abha $abha): Response
{
//cross site script
return $this->render('abha/consent_form.html.twig', [
'post_form_url' => 'request_init',
'patient_find_url' => 'patient_find',
'id' => $this->encryptor->encrypt($request->attributes->get('id'))
]);
}
/**
* M3 SUBMIT CONSENT FORM
*/
#[Route(path: '/consent-request-init', name: 'request_init', methods: ['GET', 'POST'])]
public function requestInit(Request $request, Abha $abha): Response
{
/* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
} */
//$id = $this->encryptor->encrypt($request->attributes->get('id'));
//$uri = $this->generateUrl('consent', ['id' => $id]);
$reqData = $request->request->all();
$reqData['hiuParName'] = $this->getUser()->getProfile()->getFirstName() . ' ' . $this->getUser()->getProfile()->getLastName(); // practitioner name
$reqData['hiuId'] = $this->getUser()->getProfile()->getHospital()->getHIUCode();
$request = $abha->requestInt($reqData);
if ($request) {
return $this->redirectToRoute('consent', ['id' => $reqData['id']]);
} else {
return $this->render('abha/consent_form.html.twig', [
'post_form_url' => 'request_init',
'patient_find_url' => 'patient_find'
]);
}
}
/**
* M3 REQUEST FOR DATA FROM HIP
*/
#[Route(path: '/data-request/{id}', name: 'data_request', methods: ['GET', 'POST'])]
#[ParamDecryptor(["id"])]
public function dataRequest(Request $request, Abha $abha): Response
{
/* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
} */
$id = $request->attributes->get('id');
$response = $abha->getDataRequest($id);
$id = $this->encryptor->encrypt($request->attributes->get('id'));
return $this->redirectToRoute('consent', ['id' => $id]);
}
/**
* M3 VIEW CONSENT DATA
*/
#[Route(path: '/view-data/{id}', name: 'view_data', methods: ['GET', 'POST'])]
#[ParamDecryptor(["id"])]
public function viewRequest(Request $request, Abha $abha): Response
{
/* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
} */
$id = $request->attributes->get('id');
$response = $abha->getViewData($id);
$id = $this->encryptor->encrypt($request->attributes->get('id'));
if ($response[0]) {
$uri = $this->generateUrl('consent', ['id' => $id]);
return $this->render('abha/view_consent.html.twig', [
'data' => $response[1],
'back_url' => $uri
]);
} else {
return $this->redirectToRoute('consent', ['id' => $id]);
}
}
/**
* M3 PATIENT FIND IN CONSENT REQUEST
*/
#[Route('/patient-find', name: 'patient_find', methods: ['GET', 'POST'])]
public function patientFind(Request $request, Abha $abha): Response
{
$healthId = $request->request->get('health_id');
if (!$healthId && strlen($healthId) <= 6) {
return $this->json('invalid');
}
$name = $abha->patientFind($healthId);
return $this->json($name);
}
public function getAccessToken()
{
$now = new \DateTime('now', new \DateTimeZone('UTC'));
$isoTimestamp = $now->format('Y-m-d\TH:i:s.v\Z');
$reqId = self::GUID();
try {
$client = new Client(['headers' => ['Content-Type' => 'application/json', 'X-CM-ID' => 'sbx', 'REQUEST-ID' => $reqId, 'TIMESTAMP' => $isoTimestamp]]);
// $sessionUrl = env('ABDM_URL') . '/v0.5/sessions';
$sessionUrl = 'https://dev.abdm.gov.in/api/hiecm/gateway/v3/sessions';
$tokenReq = $client->post($sessionUrl, [
'json' => [
'clientId' => 'SBX_002132',
'clientSecret' => 'dd468fe5-74f5-44f1-9fb5-47542de0f60b',
'grantType' => 'client_credentials'
]
]);
// Log::debug($tokenReq->getBody());
$res = json_decode($tokenReq->getBody(), true);
return 'Bearer ' . $res['accessToken'];
} catch (\Exception $ex) {
info('Error in fetching access token');
info($ex->getMessage());
}
}
function GUID()
{
if (function_exists('com_create_guid') === true) {
return trim(com_create_guid(), '{}');
}
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}
}