<?php
namespace App\Controller;
use App\Entity\Patient;
use App\Finder\Patient as PatientFinder;
use App\Form\PatientType;
use App\Repository\{PatientRepository, VillageRepository};
use App\Service\Sms;
use App\Util\Uploader;
use Doctrine\ORM\EntityManagerInterface;
use Nzo\UrlEncryptorBundle\Annotations\ParamDecryptor;
use Nzo\UrlEncryptorBundle\Encryptor\Encryptor;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\{IsGranted, Security};
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\{JsonResponse, Request, Response};
use Symfony\Component\Routing\Annotation\Route;
#[Route(path: '/patients'), IsGranted(data: 'IS_AUTHENTICATED_REMEMBERED')]
class PatientController extends AbstractController
{
private $encryptor;
public function __construct(private PatientFinder $patientFinder, private Sms $sms, Encryptor $encryptor)
{
$this->encryptor = $encryptor;
}
#[Route(path: '/abhaabdm', name: 'abha_patient_list', methods: ['GET'])]
public function abdmlist(PatientRepository $patientRepo, Request $request): Response
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
$qb = $patientRepo->createQueryBuilder('p')
->where('p.hospital = :hospital')
->setParameter('hospital', $this->getUser()->getHospital())
->andWhere('p.healthAddress IS NOT NULL')
->andWhere('p.healthIdNumber IS NOT NULL')
->orderBy('p.createdAt', 'DESC');
return $this->render('patient/abdmlist.html.twig', [
'patients' => $qb->getQuery()->getResult(),
]);
}
#[Route(path: '/', name: 'patient_index', methods: ['GET'])]
public function index(PatientRepository $patientRepo, Request $request): Response
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
$hospital = $this->getUser()->getHospital();
return $this->render('patient/index.html.twig', [
'patients' => $patientRepo->findBy(['hospital' => $hospital], ['createdAt' => 'DESC'])
]);
}
#[Route(path: '/new', name: 'patient_new', methods: ['GET', 'POST'])]
#[Security("is_granted('ROLE_HOSP_ADMIN') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_DENT') or is_granted('ROLE_RECEP')")]
public function new(Request $request, VillageRepository $villageRepo, EntityManagerInterface $entityManager, Uploader $uploader, PatientRepository $patientRepo): Response
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
$patient = new Patient();
$hofName = '';
$readOnly = false;
$hideFields = 'd-none';
$token = '';
$session = $request->getSession();
if ($request->getMethod() == 'GET' && $request->get('hof') || $request->get('data') || $session->has('v3data') || $request->get('dataLink')) {
$member = $this->patientFinder->getMemberDetails($request->get('hof'));
if ($member) {
$hofName = $member['first_name'] . ' ' . $member['middle_name'] . ' ' . $member['last_name'];
$patient
->setFatherHusbandName($hofName)
->setHousePlotNo($member['house_plot_no'])
->setAddress($member['address'])
->setPincode($member['pincode'])
->setFamilyIncome($member['family_income'] ?: 0)
->setMemberCode($member['member_code']);
$village = $villageRepo->find($member['village']);
if (!$village) {
$village = $villageRepo->find(1);
}
if (isset($member['healthIdNumber']) && !empty($member['healthIdNumber'] && isset($member['healthAddress']) && !empty($member['healthAddress']))) {
$hideFields = '';
}
$patient->setVillage($village);
} else {
$readOnly = true;
$hideFields = '';
if ($request->get('data')) {
$data = $request->get('data');
$token = isset($data['token']) ? $data['token'] : '';
$village = $villageRepo->find(1);
if ($data['gender'] == 'M') {
$gender = 'Male';
} elseif ($data['gender'] == 'F') {
$gender = 'Female';
} elseif ($data['gender'] == 'O') {
$gender = 'Other';
} elseif ($data['gender'] == 'U') {
$gender = 'Male';
}
$dob = '';
if (isset($data['monthOfBirth'], $data['dayOfBirth'], $data['yearOfBirth'])) {
$dob = $data['yearOfBirth'] . '-' . $data['monthOfBirth'] . '-' . $data['dayOfBirth'];
}
$patient
->setFirstName($data['firstName'])
->setMiddleName($data['middleName'])
->setLastName($data['lastName'])
->setMobile($data['mobile'])
->setGender($gender)
->setHealthIdNumber($data['healthIdNumber'])
->setHealthAddress($data['healthIdAddress'])
->setDob(new \DateTime('@' . strtotime($dob)));
} elseif ($request->get('dataLink')) {
$data = $request->get('dataLink');
$token = isset($data['token']) ? $data['token'] : '';
$dob = $gender = '';
if (isset($data['monthOfBirth'], $data['dayOfBirth'], $data['yearOfBirth'])) {
$dob = $data['yearOfBirth'] . '-' . $data['monthOfBirth'] . '-' . $data['dayOfBirth'];
}
if ($data['gender'] == 'M') {
$gender = 'Male';
} elseif ($data['gender'] == 'F') {
$gender = 'Female';
} elseif ($data['gender'] == 'O') {
$gender = 'Other';
} elseif ($data['gender'] == 'U') {
$gender = 'Male';
}
$patient
->setFirstName($data['firstName'])
->setMiddleName($data['middleName'])
->setLastName($data['lastName'])
->setGender($gender)
->setMobile($data['mobile'])
->setHealthIdNumber($data['healthIdNumber'])
->setHealthAddress($data['healthIdAddress']);
if ($dob) {
$patient->setDob(new \DateTime('@' . strtotime($dob)));
}
} elseif ($session->has('v3data')) {
$data = $session->get('v3data');
// dd($data);
$session->remove('v3data');
$token = isset($data['token']) ? $data['token'] : '';
$village = $villageRepo->find(1);
if ($data['gender'] == 'M') {
$gender = 'Male';
} elseif ($data['gender'] == 'F') {
$gender = 'Female';
} elseif ($data['gender'] == 'O') {
$gender = 'Other';
} elseif ($data['gender'] == 'U') {
$gender = 'Male';
}
$dob = isset($data['yearOfBirth'], $data['monthOfBirth'], $data['dayOfBirth'])
? sprintf('%s-%s-%s', $data['yearOfBirth'], $data['monthOfBirth'], $data['dayOfBirth'])
: '';
$patient
->setFirstName($data['firstName'])
->setMiddleName($data['middleName'])
->setLastName($data['lastName'])
->setMobile($data['mobile'])
->setAddress($data['address'])
->setPincode($data['pincode'])
// ->setPhoto($data['profilePhoto'])
->setGender($gender)
->setHealthIdNumber($data['healthIdNumber'])
->setHealthAddress($data['healthIdAddress'])
->setDob(new \DateTime('@' . strtotime($dob)));
}
}
}
$form = $this->createForm(PatientType::class, $patient);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$hospital = $this->getUser()->getHospital();
$patient->setHospital($hospital);
if ($request->files->get('patient')['photo']) {
$command = 'exiftool -all= ' . $request->files->get('patient')['photo'];
shell_exec($command);
$patient->setPhoto($uploader->processUpload(
$this->getParameter('upload_dir') . DIRECTORY_SEPARATOR . 'patient_photos',
$request->files->get('patient')['photo']
));
}
$entityManager->persist($patient);
$entityManager->flush();
$patient->setUHId(date('Y') . sprintf('%04d', $hospital->getId()) . sprintf('%010d', $patient->getId()));
if (!$patient->getMemberCode()) {
$patient->setMemberCode($patient->getUHId());
}
$data = $request->get('data');
if ($data) {
$abhaArr['healthIdNumber'] = $data['healthIdNumber'] ? $data['healthIdNumber'] : '';
$abhaArr['healthIdAddress'] = $data['healthIdAddress'] ? $data['healthIdAddress'] : '';
$abhaArr['token'] = $data['token'] ? $data['token'] : '';
$abhaArr['refresh_token'] = isset($data['refresh_token']) ? $data['refresh_token'] : '';
$patientRepo->addAbhaDetail($abhaArr, $patient->getId()); // add details in abha table
}
$entityManager->persist($patient);
$entityManager->flush();
$this->addFlash(
'success',
'New patient registered successfully!'
);
return $this->redirectToRoute('case_new', ['patient_id' => $this->encryptor->encrypt($patient->getId())]);
}
return $this->renderForm('patient/new.html.twig', [
'patient' => $patient,
'form' => $form,
'token' => $token,
'name' => $hofName,
'read_only' => $readOnly,
'hideAbha' => $hideFields
]);
}
#[Route(path: '/register', name: 'patient_register', methods: ['POST'])]
#[Security("is_granted('ROLE_HOSP_ADMIN') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_DENT') or is_granted('ROLE_RECEP')")]
public function registerFromCnmgts(Request $request, VillageRepository $villageRepo, EntityManagerInterface $entityManager): Response
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
$member = $this->patientFinder->getMemberDetails($request->request->get('member_id'));
$patient = new Patient();
$patient
->setFirstName($member['first_name'])
->setMiddleName($member['middle_name'])
->setLastName($member['last_name'])
->setAdharNum($member['adhar_num'])
->setDob(new \DateTime('@' . strtotime($member['dob'])))
->setHousePlotNo($member['house_plot_no'])
->setAddress($member['address'])
->setPincode($member['pincode'])
->setMemberCode($member['member_code'])
->setMobile($member['mobile'])
->setEmail($member['email'])
->setFatherHusbandName($member['father_husband_name'])
->setGender($member['gender'])
->setMaritalStatus($member['marrital_status'])
->setBplNum($member['bpl_num'])
->setAbpmJay($member['abpm_jay'])
// ->setCast($member['cast'] ?: 'General')
->setOccupation($member['occupation'])
->setFamilyIncome((int) $member['family_income'] ?: 0)
->setHospital($this->getUser()->getHospital());
$village = $villageRepo->find($member['village']);
if (!$village) {
$village = $villageRepo->find(1);
}
$patient->setVillage($village);
try {
$entityManager->persist($patient);
$entityManager->flush();
$hospital = $this->getUser()->getHospital();
$patient->setUHId('UH-' . $hospital->getType() . '-' . date('Y') . '-' . sprintf('%04d', $hospital->getId()) . '-' . sprintf('%010d', $patient->getId()));
$entityManager->persist($patient);
$entityManager->flush();
$this->addFlash(
'success',
'New patient registered successfully!'
);
return $this->redirectToRoute('case_new', ['patient_id' => $patient->getId()]);
} catch (\Exception) {
$this->addFlash(
'danger',
'Patient already exists!'
);
return $this->redirectToRoute('patient_index');
}
}
#[Route(path: '/edit/{id}', name: 'patient_edit', methods: ['GET', 'POST'])]
#[ParamDecryptor(['id'])]
#[Security("is_granted('ROLE_HOSP_ADMIN') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_DENT') or is_granted('ROLE_RECEP') or is_granted('ROLE_ADMIN')")]
public function edit(Request $request, SessionInterface $session, Patient $patient, EntityManagerInterface $entityManager, Uploader $uploader): Response
{
if ($this->getUser()->getHospital()->getId() != $patient->getHospital()->getId()) {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
if ($request->getMethod() == 'GET' || $request->getMethod() == 'POST' && $this->getUser()->getHospital()->getId() == $patient->getHospital()->getId() && $patient->getisAlive() == true) {
$session->set('_id', $request->attributes->get('id'));
$form = $this->createForm(PatientType::class, $patient);
$form->handleRequest($request);
$readOnly = '';
if ($form->isSubmitted() && $form->isValid()) {
if ($request->files->get('patient')['photo']) {
$command = 'exiftool -all= ' . $request->files->get('patient')['photo'];
shell_exec($command);
$patient->setPhoto($uploader->processUpload(
$this->getParameter('upload_dir') . DIRECTORY_SEPARATOR . 'patient_photos',
$request->files->get('patient')['photo'],
$patient->getPhoto()
));
}
$entityManager->flush();
$session->remove('_id');
$entityManager->flush();
$session->remove('_id');
$this->addFlash(
'success',
'Patient updated successfully!'
);
return $this->redirectToRoute('patient_index');
}
return $this->renderForm('patient/edit.html.twig', [
'patient' => $patient,
'form' => $form,
'read_only' => $readOnly
]);
} else {
if ($session->has('_id')) {
if ($session->get('_id') != $request->attributes->get('id')) {
$this->createAccessDeniedException();
}
} else {
$this->createAccessDeniedException();
}
}
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
#[Route(path: '/show/{id}', name: 'patient_show', methods: ['GET'])]
#[ParamDecryptor(['id'])]
public function show(Patient $patient): Response
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
if ($this->getUser()->getHospital()->getId() == $patient->getHospital()->getId()) {
return $this->render('patient/show.html.twig', [
'patient' => $patient
]);
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
#[Route(path: '/delete/{id}', name: 'patient_delete', methods: ['GET'])]
#[Security("is_granted('ROLE_HOSP_ADMIN') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_DENT') or is_granted('ROLE_RECEP')")]
#[ParamDecryptor(['id'])]
public function delete(Patient $patient, EntityManagerInterface $entityManager): Response
{
if ($this->getUser()->getHospital()->getId() == $patient->getHospital()->getId() && $patient->getisAlive() == true) {
try {
$entityManager->remove($patient);
$entityManager->flush();
$this->addFlash(
'success',
'Patient deleted successfully!'
);
} catch (\Exception) {
$this->addFlash(
'danger',
'Patient could not be deleted! There may be related cases.'
);
}
return $this->redirectToRoute('patient_index');
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
#[Route(path: '/search', name: 'patient_search', methods: ['GET'])]
#[Security("is_granted('ROLE_HOSP_ADMIN') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_DENT') or is_granted('ROLE_RECEP') or is_granted('ROLE_LAB_TECH')")]
public function searchPatient(): Response
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
return $this->render('patient/search.html.twig');
}
#[Route(path: '/local-search-results', name: 'local_search_patient', methods: ['GET'])]
#[Security("is_granted('ROLE_HOSP_ADMIN') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_DENT') or is_granted('ROLE_RECEP') or is_granted('ROLE_LAB_TECH')")]
public function localSearchResults(Request $request, PatientRepository $patientRepo): JsonResponse
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
return $this->json($patientRepo->findSearchResults($request->query->get('search')));
}
#[Route(path: '/global-search-results', name: 'global_search_member', methods: ['GET'])]
#[Security("is_granted('ROLE_HOSP_ADMIN') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_DENT') or is_granted('ROLE_RECEP') or is_granted('ROLE_LAB_TECH')")]
public function globalSearchResults(Request $request): JsonResponse
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
$patients = $this->patientFinder->getGlobalSearchResults($request->query->get('search'));
return $this->json($patients);
}
#[Route(path: '/family-details', name: 'get_family', methods: ['POST'])]
#[Security("is_granted('ROLE_HOSP_ADMIN') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_DENT') or is_granted('ROLE_RECEP')")]
public function familyDetails(Request $request): JsonResponse
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
return $this->json($this->patientFinder->getFamilyList($request->request->get('hofID')));
}
#[Route(path: '/personal-info', name: 'patient_personal_info')]
public function personalInfo(PatientRepository $patientRepo, $id = 0): Response
{
if ($this->getUser()->getisActive() == false && $this->getUser()->getRoles() != 'ROLE_HOSP_ADMIN') {
return $this->render('bundles/TwigBundle/Exception/errorBlock.html.twig');
}
return $this->render('patient/personal_info.html.twig', [
'patient' => $patientRepo->find($id)
]);
}
#[Route(path: '/id-card/{id}', name: 'patient_id_card')]
#[ParamDecryptor(['id'])]
public function idCard(Request $request, Patient $patient): Response
{
if ($this->getUser()->getHospital()->getId() == $patient->getHospital()->getId()) {
return $this->render('patient/id_card.html.twig', ['patient' => $patient, 'type' => 'patient_list']);
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
#[Route(path: '/print/{id}', name: 'patient_print', methods: ['GET'])]
#[ParamDecryptor(['id'])]
public function print(Patient $patient): Response
{
if ($this->getUser()->getHospital()->getId() == $patient->getHospital()->getId()) {
return $this->render('patient/print.html.twig', ['patient' => $patient]);
} else {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
}
#[Route(path: '/search_abha', name: 'patient_search_with_abha', methods: ['GET', 'POST'])]
public function searchAbha(Request $request, PatientRepository $patientRepo): Response
{
// get request check empty or not
// is request is empty
/* if (!$request->request->get('search')) {
$this->addFlash(
'danger',
'please enter abha address'
);
// set error and redirect to this template
return $this->render('patient/search_abha.html.twig');
} */
if ($request->request->get('search')) { // get request check empty or not
$responseData = $patientRepo->getAbhaAddressBySearch($request->request->get('search')); // get response by search abha address
if (!empty($responseData)) {
$session = $request->getSession();
$session->set('patient_id', $responseData[0]['id']);
return new JsonResponse(['responseData' => $responseData]); // json response
}
}
return $this->render('patient/search_abha.html.twig');
}
#[Route(path: '/shared-profile', name: 'shared_profile', methods: ['GET', 'POST'])]
public function sharedProfile(Request $request): Response
{
// TODO data encrypted
// define hip code and get code from hospital table
$hipCode = $this->getUser()->getProfile()->getHospital()->getHIPCode();
// define payload
$payload = [
'hip_id' => $hipCode,
];
$client = HttpClient::create();
$response = $client->request('POST', 'https://abdm.7mantra.in/data-link/get-shared-profile', [
'headers' => [
'Content-Type' => 'application/json'
],
'json' => $payload
]);
$responseData = json_decode($response->getContent());
return new JsonResponse(['responseData' => $responseData]);
}
}