<?php
namespace App\Controller;
use App\Entity\{CaseHistory, Cases, WardMedicineSchedule};
use App\Form\WardBedType;
use App\Repository\{CaseRepository, DeathCauseRepository, WardBedRepository, WardMedicineScheduleRepository};
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\{Request, Response};
use Symfony\Component\Routing\Annotation\Route;
use Nzo\UrlEncryptorBundle\Annotations\ParamDecryptor;
use Nzo\UrlEncryptorBundle\Encryptor\Encryptor;
#[Route(path: '/ward-beds'), Security("is_granted('ROLE_DOC') or is_granted('ROLE_DENT')")]
class WardBedController extends AbstractController
{
private $encryptor;
public function __construct(Encryptor $encryptor)
{
$this->encryptor = $encryptor;
}
#[Route(path: '/manage/{id}', name: 'ward_bed_manage', methods: ['GET', 'POST'])]
#[ParamDecryptor(["id"])]
public function manage(Request $request, Cases $case, CaseRepository $caseRepo, WardBedRepository $wardBedRepo, EntityManagerInterface $entityManager, DeathCauseRepository $deathCauseRepo): Response
{
if ($case->getIsWard() !== true && $case->getHospital()->getId() != $this->getUser()->getprofile()->getHospital()->getId()) {
return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
}
$wardBed = $wardBedRepo->findOneBy(['case' => $case, 'status' => 'Admitted']);
$form = $this->createForm(WardBedType::class, $wardBed, ['allow_extra_fields' => true]);
$form->handleRequest($request);
if ($case->getIsWard() && $request->isMethod('POST')) {
$getTotalBed = $caseRepo->getTotalBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('ward_bed')['ward']);
if (!empty($getTotalBed)) {
$getOccupiedBedBedData = $caseRepo->getOccupiedBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('ward_bed')['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('ward_bed/manage.html.twig', [
'case' => $case,
'form' => $form,
'ward_bed' => $wardBed,
'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
'case_ward_medicines' => $caseRepo->getCaseWardMedicines($this->encryptor->encrypt($case->getId()))
]);
}
if ($case->getPatient()->getGender() == "Female" && (empty($totalFemaleBed) || empty($availableFemaleBad))) {
$this->addFlash(
'danger',
'Female bed is not available.'
);
return $this->renderForm('ward_bed/manage.html.twig', [
'case' => $case,
'form' => $form,
'ward_bed' => $wardBed,
'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
'case_ward_medicines' => $caseRepo->getCaseWardMedicines($this->encryptor->encrypt($case->getId()))
]);
}
}
} else {
$this->addFlash(
'danger',
'Bed not available.'
);
return $this->renderForm('ward_bed/manage.html.twig', [
'case' => $case,
'form' => $form,
'ward_bed' => $wardBed,
'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
'case_ward_medicines' => $caseRepo->getCaseWardMedicines($this->encryptor->encrypt($case->getId()))
]);
}
}
if ($form->isSubmitted() && $form->isValid() && $case->getHospital()->getId() == $this->getUser()->getprofile()->getHospital()->getId()) {
$formData = $request->request->get('ward_bed');
if (isset($formData['ward_staff_notes'])) {
$case->setWardStaffNotes($formData['ward_staff_notes']);
$entityManager->persist($case);
}
if ($wardBed->getStatus() == 'Discharged' || $wardBed->getStatus() == 'Death of Patient') {
$case->setIsWard(false);
if ($wardBed->getStatus() == 'Death of Patient') {
$case
->setClosureReason('Death of patient')
->setIsClosed(true);
$deathCause = $deathCauseRepo->find($formData['death_cause']);
$patient = $case->getPatient();
$patient
->setIsAlive(false)
->setExpiredAt(new \DateTime())
->setDeathCause($deathCause);
$entityManager->persist($patient);
}
$entityManager->persist($case);
}
$entityManager->flush();
$wardMedicines = $formData['ward_medicines'] ?? [];
if (isset($wardMedicines) && count($wardMedicines) == 6) {
$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' => 1,
'created_by' => $this->getUser()->getId()
];
}
$caseRepo->saveCaseWardMedicines($wardMedicineData);
$wardMedsForHistory = $caseRepo->getMedicineNames($wardMedicines['id']);
$history = new CaseHistory();
$history
->setCase($case)
->setDoctor($case->getDoctor())
->setWardMedicines(implode(', ', $wardMedsForHistory));
$entityManager->persist($history);
$entityManager->flush();
}
$this->addFlash(
'success',
'Ward details updated successfully!'
);
return $this->redirectToRoute('case_index');
}
return $this->renderForm('ward_bed/manage.html.twig', [
'case' => $case,
'form' => $form,
'ward_bed' => $wardBed,
'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
'case_ward_medicines' => $caseRepo->getCaseWardMedicines($this->encryptor->encrypt($case->getId()))
]);
}
#[Route(path: '/missed-schedules', name: 'ward_bed_missed_schedules', methods: ['GET'])]
public function missedSchedules(WardMedicineScheduleRepository $wardMedicineScheduleRepo): Response
{
$schedules = $wardMedicineScheduleRepo->getMissedSchedules($this->getUser()->getId());
return $this->render('ward_bed/missed_schedules.html.twig', [
'schedules' => $schedules
]);
}
#[Route(path: '/mark-schedule/{id}', name: 'ward_bed_mark_schedule', methods: ['GET'])]
#[ParamDecryptor(["id"])]
public function markSchedule(WardMedicineSchedule $schedule, WardMedicineScheduleRepository $wardMedicineScheduleRepo): Response
{
if ($wardMedicineScheduleRepo->markAsCompleted([$this->encryptor->encrypt($schedule->getId())])) {
$this->addFlash(
'success',
'Schedule successfully marked as "completed"!'
);
} else {
$this->addFlash(
'danger',
'Schedule cound not be marked as "completed"!'
);
}
return $this->redirectToRoute('ward_bed_missed_schedules');
}
}