Files
streamline-emr/docker/statistics/Modules/ClinicalData/Http/Controllers/ClinicController.php
T
2025-03-31 03:46:05 +03:00

215 lines
7.2 KiB
PHP
Executable File

<?php
namespace Modules\ClinicalData\Http\Controllers;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Modules\ClinicalData\Services\Clinics\ClinicsServiceInterface;
use Streamline\Models\Clinic;
use Streamline\Models\Triage;
use Streamline\Models\PatientEpisode;
use Streamline\Services\StreamlineSetupServiceInterface;
class ClinicController extends Controller {
protected ClinicsServiceInterface $clinicService;
protected StreamlineSetupServiceInterface $setupService;
public function __construct(ClinicsServiceInterface $clinicService, StreamlineSetupServiceInterface $setupService) {
$this->middleware('auth');
$this->middleware('permission:clinic-list', ['only' => ['index']]);
$this->middleware('permission:clinic-create', ['only' => ['create', 'store']]);
$this->middleware('permission:clinic-edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:clinic-delete', ['only' => ['destroy', 'inactive', 'activate']]);
$this->clinicService = $clinicService;
$this->setupService = $setupService;
}
/**
* Display a listing of the resource.
*
* @return View
*/
public function index(): View
{
$clinics = Clinic::orderBy('name', 'asc')
->paginate(50);
$clinic_types = $this->clinicService->getClinicTypes();
$clinic_ids = PatientEpisode::distinct('clinic_id')->whereNotNull('clinic_id')->pluck('clinic_id', 'clinic_id')->toArray();
$triage_clinics = Triage::distinct('clinic_allocation')->whereNotNull('clinic_allocation')->pluck('clinic_allocation', 'clinic_allocation')->toArray();
foreach ($triage_clinics as $value) if(!empty($value) && !in_array($value,$clinic_ids)) $clinic_ids[$value] = $value;
return view('clinical_data::clinics.index', compact('clinics', 'clinic_types', 'clinic_ids'));
}
/**
* Show the form for creating a new resource.
*
* @return View
*/
public function create(): View
{
$clinics = $this->clinicService->getClinicsSeeder();
$clinic_types = $this->clinicService->getClinicTypes();
return view('clinical_data::clinics.create',compact('clinics', 'clinic_types'));
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return RedirectResponse
*/
public function store(Request $request): RedirectResponse
{
//validation passed
if (isset($request->skip)&& session()->has('streamline_setup')) {
//update the streamline setup table with the new finished step
$this->setupService->saveStep("clinics registration", 1);
return redirect("wards/create");
} else {
$createdClinic = $this->clinicService->createClinic($request->name, $request->clinic_type, $request->available);
if ($createdClinic) {
flash($request->name . " Clinic has been saved")->success();
} else {
flash("An error occurred will saving the clinic")->error();
}
//in case more clinics have been added during the initial setup
if (session()->has('streamline_setup')) {
if (isset($request->other_clinics)) {
$other_clinics_array = $request->other_clinics;
for ($i=0; $i < count($other_clinics_array) ; $i++) {
$createdClinic = $this->clinicService->createClinic($other_clinics_array[$i]);
}
}
if (isset($request->selected_clinics)) {
$selected_clinics_array = $request->selected_clinics;
$seeder_clinics = $this->clinicService->getClinicsSeeder();
for ($i=0; $i < count($selected_clinics_array) ; $i++) {
$clinic_name = $seeder_clinics[$selected_clinics_array[$i]]["name"];
$clinic_slug = $seeder_clinics[$selected_clinics_array[$i]]["slug"];
$createdClinic = $this->clinicService->createClinic($clinic_name, $clinic_slug);
}
}
// update the streamline setup table with the new finished step
$this->setupService->saveStep("clinics registration", 1);
flash("Clinics have been added")->success();
return redirect("wards/create");
}
return redirect("/clinics/");
}
}
/**
* Show the form for editing the specified resource.
*
*/
public function edit($id): View | RedirectResponse
{
$clinic = $this->clinicService->getClinicById($id);
$clinic_types = $this->clinicService->getClinicTypes();
if (!$clinic) {
flash()->error("Clinic not found");
return redirect('/clinics/');
} else {
return view('clinical_data::clinics.edit', compact('clinic', 'clinic_types'));
}
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param int $id
* @return RedirectResponse
*/
public function update(Request $request, int $id): RedirectResponse
{
request()->validate([
'name' => 'required'
]);
//validation passed
$updated_clinic = $this->clinicService->editClinic($id, $request->name, $request->available, $request->clinic_type);
if ($updated_clinic) {
flash($request->name . " clinic has been updated")->success();
return redirect("/clinics/");
} else {
flash("An error occurred! Please try again later")->error();
return back()->withInput();
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return RedirectResponse
*/
public function destroy(int $id): RedirectResponse {
$isClinicDeleted = $this->clinicService->deactivateClinic($id);
if ($isClinicDeleted) {
flash("Clinic has been deleted.")->success();
return redirect('/clinics/');
} else {
flash("An error occurred")->error();
return redirect('/clinics/');
}
}
/**
* Display a listing of the inactive resource(s).
*
* @return RedirectResponse|View
*/
public function inactive(): RedirectResponse|View {
$clinics = Clinic::onlyTrashed()
->orderBy('name', 'asc')
->paginate(50);
if (empty($clinics)) {
flash()->error("There is no inactive clinic");
return redirect('/clinics/');
} else {
return view('clinical_data::clinics.inactive', compact('clinics'));
}
}
/**
* Activate the specified resource in storage.
*
* @param int $id
* @return RedirectResponse
*/
public function activate(int $id): RedirectResponse
{
$isClinicActive = $this->clinicService->activateClinic($id);
if($isClinicActive[0]){
flash($isClinicActive[1])->success();
} else {
flash($isClinicActive[1])->error();
}
return redirect('/clinics/inactive');
}
}