mirror of
https://gitlab.com/signalytic/client-external/streamline/streamline-emr.git
synced 2026-09-11 10:41:32 +00:00
232 lines
11 KiB
PHP
Executable File
232 lines
11 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Modules\Patients\Http\Controllers;
|
|
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Streamline\Models\Clinic;
|
|
use Streamline\Models\PatientEpisode;
|
|
use Streamline\Models\InpatientInfo;
|
|
use Illuminate\Database\QueryException;
|
|
use Streamline\Models\Consultation;
|
|
|
|
class PatientFlowMonitoringController extends Controller {
|
|
|
|
public function __construct() {
|
|
$this->middleware('auth');
|
|
$this->middleware('permission:patient-flow-monitoring');
|
|
}
|
|
|
|
public function index(Request $request){
|
|
$clinic_id = $request->clinic_id;
|
|
$search_by = $request->search_by;
|
|
$reg_date = $request->reg_date;
|
|
$start_date = $request->start_date;
|
|
$end_date = $request->end_date;
|
|
$order_by = $request->order_by ?? 1;
|
|
|
|
if (!isset($clinic_id) && !isset($search_by)){
|
|
$clinic_id = session()->get('clinic_id');
|
|
$search_by = session()->get('search_by');
|
|
$reg_date = session()->get('reg_date');
|
|
$start_date = session()->get('start_date');
|
|
$end_date = session()->get('end_date');
|
|
$order_by = session()->get('order_by');
|
|
} else {
|
|
session()->put('clinic_id', $clinic_id);
|
|
session()->put('search_by', $search_by);
|
|
session()->put('reg_date', $reg_date);
|
|
session()->put('start_date', $start_date);
|
|
session()->put('end_date', $end_date);
|
|
session()->put('order_by', $order_by);
|
|
}
|
|
|
|
if($search_by === 0){
|
|
// last 24 hours
|
|
$start_date_search = Carbon::yesterday()->startOfDay()->toDateTimeString();
|
|
$end_date_search = Carbon::yesterday()->endOfDay()->toDateTimeString();
|
|
|
|
$date_search = "Yesterday";
|
|
} elseif($search_by == 1){
|
|
// custom date
|
|
$start_date_search = Carbon::parse($reg_date)->startOfDay()->toDateTimeString();
|
|
$end_date_search = Carbon::parse($reg_date)->endOfDay()->toDateTimeString();
|
|
|
|
$date_search = streamline_date($start_date_search);
|
|
} elseif($search_by == 2){
|
|
// custom date range
|
|
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateTimeString();
|
|
$end_date_search = Carbon::parse($end_date)->endOfDay()->toDateTimeString();
|
|
|
|
$date_search = streamline_date($start_date_search) . " to " . streamline_date($end_date_search);
|
|
} else {
|
|
// Today
|
|
$start_date_search = Carbon::today()->startOfDay()->toDateTimeString();
|
|
$end_date_search = Carbon::today()->endOfDay()->toDateTimeString();
|
|
|
|
$date_search = "Today";
|
|
}
|
|
|
|
switch (get_select_clinic_order_type()) {
|
|
case 0:
|
|
if ($order_by == 0) {
|
|
$order_by_text = "patient_episodes.id";
|
|
} else {
|
|
$order_by_text = "triage.severe_grade desc, patient_episodes.id";
|
|
}
|
|
break;
|
|
case 1:
|
|
if ($order_by == 0) {
|
|
$order_by_text = "patient_episodes.id desc";
|
|
} else {
|
|
$order_by_text = "triage.severe_grade desc, patient_episodes.id desc";
|
|
}
|
|
break;
|
|
case 2:
|
|
default:
|
|
if ($order_by == 0) {
|
|
$order_by_text = "consultations.completed, patient_episodes.id";
|
|
} else {
|
|
$order_by_text = "consultations.completed, triage.severe_grade desc, patient_episodes.id";
|
|
}
|
|
break;
|
|
}
|
|
|
|
if($clinic_id == 0){
|
|
$patient_episodes = DB::table('patient_episodes')
|
|
->whereNull('patient_episodes.deleted_at')
|
|
->leftJoin('consultations', 'patient_episodes.id', '=', 'consultations.episode_id')
|
|
->leftJoin('ante_natal_clinic_followups as a', 'patient_episodes.id', '=', 'a.episode_id')
|
|
->leftJoin('triage', 'patient_episodes.id', '=', 'triage.episode_id')
|
|
->select('patient_episodes.*', 'consultations.primary_diagnosis','consultations.outcome_id','consultations.completed','consultations.created_by as consultation_created_by','consultations.updated_by as consultation_updated_by','consultations.consultation_done_by', 'a.primary_diagnosis as antenatal_primary_diagnosis','a.outcome_id as antenatal_outcome_id','a.completion_status as antenatal_completed','a.created_by as antenatal_created_by','a.updated_by as antenatal_updated_by', 'triage.id as episode_triage_id', 'triage.severe_grade', 'triage.clinic_allocation')
|
|
->whereBetween('patient_episodes.created_at', [$start_date_search, $end_date_search])
|
|
->orderByRaw($order_by_text)
|
|
->paginate(200);
|
|
$clinic_name = "OPD";
|
|
} else {
|
|
$patient_episodes = DB::table('patient_episodes')
|
|
->whereNull('patient_episodes.deleted_at')
|
|
->leftJoin('consultations', 'patient_episodes.id', '=', 'consultations.episode_id')
|
|
->leftJoin('ante_natal_clinic_followups as a', 'patient_episodes.id', '=', 'a.episode_id')
|
|
->leftJoin('triage', 'patient_episodes.id', '=', 'triage.episode_id')
|
|
->where(['patient_episodes.clinic_id' => $clinic_id])
|
|
->whereBetween('patient_episodes.created_at', [$start_date_search, $end_date_search])
|
|
->orderByRaw($order_by_text)
|
|
->select('patient_episodes.*', 'consultations.primary_diagnosis','consultations.outcome_id','consultations.completed','consultations.created_by as consultation_created_by','consultations.updated_by as consultation_updated_by','consultations.consultation_done_by', 'a.primary_diagnosis as antenatal_primary_diagnosis','a.outcome_id as antenatal_outcome_id','a.completion_status as antenatal_completed','a.created_by as antenatal_created_by','a.updated_by as antenatal_updated_by','triage.id as episode_triage_id', 'triage.severe_grade', 'triage.clinic_allocation')
|
|
->paginate(200);
|
|
$clinic_name = get_name($clinic_id, 'id', 'name', 'clinics');
|
|
}
|
|
|
|
$patient_categories = DB::table("patient_categories")->whereNull('deleted_at')->pluck("name", "id");
|
|
|
|
$clinics = DB::table("clinics")->whereNull("deleted_at")->orderBy("name")->pluck("name", "id")->toArray();
|
|
$clinics = [0 => 'OPD'] + $clinics;
|
|
$clinics = ['' => '- select -'] + $clinics;
|
|
|
|
$diagnoses = DB::table('diagnoses')->where('available', 1)->whereNull('deleted_at')->pluck("name", "id")->toArray();
|
|
|
|
$wards = DB::table('wards')->where('available', 1)->whereNull('deleted_at')->pluck("name", "id")->prepend('- select -', '');
|
|
|
|
return view('patients::patient_flow_monitoring.index', compact('patient_episodes', 'clinics', 'patient_categories','clinic_name','search_by', 'date_search', 'wards', 'diagnoses'));
|
|
}
|
|
|
|
public function patient_route($episode_id, $route){
|
|
|
|
$episode = PatientEpisode::find($episode_id);
|
|
$patient_id = $episode->patient_id;
|
|
|
|
// set up session
|
|
session()->put(['patient_id' => $patient_id]);
|
|
session()->put(['episode_id' => $episode_id]);
|
|
|
|
if($route == 'triage'){
|
|
$url = '/triage';
|
|
session()->put('triage_without_etat', 0);
|
|
} elseif ($route == 'consultation'){
|
|
session()->put('consultation_with_notes', 0);
|
|
$url = '/consultation/route';
|
|
} elseif ($route == 'create_anaesthetics'){
|
|
$url = '/anaesthetics/create';
|
|
} elseif ($route == 'create_surgery'){
|
|
$url = '/theatre_surgery/create';
|
|
} elseif ($route == 'anaesthetics_history'){
|
|
$url = '/anaesthetics/history';
|
|
} elseif ($route == 'surgery_index'){
|
|
$url = '/theatre_surgery';
|
|
} elseif ($route == 'treatment') {
|
|
$url = '/prescriptions/create';
|
|
} elseif ($route == 'anc_registration_button'){
|
|
$url = '/ante_natal_clinic/create';
|
|
} elseif ($route == 'anc_followup_button'){
|
|
$url = '/ante_natal_clinic_follow_up/create';
|
|
} elseif ($route == 'investigation') {
|
|
$url = '/investigations/investigations_review';
|
|
} elseif ($route == 'triage_without_etat') {
|
|
session()->put('triage_without_etat', 1);
|
|
$url = '/triage';
|
|
} elseif ($route == 'consultation_with_notes') {
|
|
session()->put('consultation_with_notes', 1);
|
|
$url = '/consultation/route';
|
|
} elseif ($route == 'view_patient_history') {
|
|
$url = '/patient_episodes/';
|
|
} elseif ($route == 'main_exam') {
|
|
$url = '/eye_clinic/main_exam_route';
|
|
} elseif ($route == 'base_refraction_exam') {
|
|
$url = '/eye_clinic/base_exam_refraction';
|
|
}
|
|
|
|
return response()->json($url);
|
|
}
|
|
|
|
public function inpatient_admission(Request $request)
|
|
{
|
|
$episode = PatientEpisode::find($request->admission_episode_id);
|
|
$patient_id = $episode->patient_id;
|
|
$ward_id = $request->admission_ward_id;
|
|
$admitted_on = $request->ward_admission_date;
|
|
|
|
try {
|
|
$episode_id = $episode->id;
|
|
session()->put(['episode_id' => $episode_id]);
|
|
session()->put(['patient_id' => $patient_id]);
|
|
|
|
$consultation = Consultation::where(['patient_id' => $patient_id, 'episode_id' => $episode_id])->first();
|
|
if ($consultation) {
|
|
$consultation->outcome_id = get_name("Admitted", "name", "id", "outcomes");
|
|
$consultation->ward_id = $ward_id;
|
|
$consultation->admitted_on = $admitted_on;
|
|
$consultation->save();
|
|
}
|
|
|
|
// Admit patient in ward
|
|
$existing_inpatient = InpatientInfo::where(['episode_id' => $episode_id])->first();
|
|
if ($existing_inpatient) {
|
|
$ward_id = $existing_inpatient->ward_id;
|
|
$ward_name = get_name($ward_id, "id", "name", "wards");
|
|
|
|
flash("Patient ".get_name($patient_id, "id", "number", "patients")." already admitted for in admitted in ".$ward_name. ". You can use the ward transfer option incase you want to transfer to another ward")->error();
|
|
} else {
|
|
$inpatient = is_null($existing_inpatient) ? new InpatientInfo : $existing_inpatient;
|
|
$inpatient = new InpatientInfo;
|
|
$inpatient->patient_id = $patient_id;
|
|
$inpatient->episode_id = $episode_id;
|
|
$inpatient->admitted_on = $admitted_on;
|
|
$inpatient->ward_id = $ward_id;
|
|
$inpatient->created_by = auth()->user()->id;
|
|
$inpatient->created_at = Carbon::now();
|
|
$inpatient->save();
|
|
|
|
$ward_name = get_name($ward_id, "id", "name", "wards");
|
|
|
|
flash("Patient ".get_name($patient_id, "id", "number", "patients")." admitted in ".$ward_name)->success();
|
|
}
|
|
|
|
return redirect('/patient_episodes/');
|
|
} catch (QueryException $e) {
|
|
flash("This episode already exists!")->error();
|
|
return back()->withInput();
|
|
}
|
|
}
|
|
}
|