mirror of
https://gitlab.com/signalytic/client-external/streamline/streamline-emr.git
synced 2026-09-11 18:51:31 +00:00
210 lines
9.7 KiB
PHP
Executable File
210 lines
9.7 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Modules\Reports\Http\Controllers;
|
|
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Streamline\Models\Consultation;
|
|
use Streamline\Models\Diagnosis;
|
|
use Streamline\Models\Drug;
|
|
use Streamline\Models\PatientAppointment;
|
|
use Streamline\Models\Treatment;
|
|
|
|
class MentalHealthReportsController extends Controller {
|
|
|
|
public function diagnosed_patients(Request $request){
|
|
if (isset($request->start_date)){
|
|
$start_date = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString();
|
|
$end_date = Carbon::parse($request->end_date)->endOfDay()->toDateTimeString();
|
|
} else {
|
|
$start_date = Carbon::now()->startOfDay()->toDateTimeString();
|
|
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
|
|
}
|
|
|
|
// get all diagnoses with hmis category mental health
|
|
$diagnoses = Diagnosis::where('hmis_category', 8)->get()->toArray();
|
|
|
|
$reports = [];
|
|
|
|
foreach ($diagnoses as $diagnosis){
|
|
$patient_ids =[];
|
|
$consultation = Consultation::where('primary_diagnosis', $diagnosis['id'])->whereBetween('created_at', [$start_date, $end_date])->get();
|
|
if(!empty($consultation)) foreach ($consultation as $key => $value) $patient_ids[] = $value->patient_id;
|
|
|
|
$reports[] = ['name'=>$diagnosis['name'], 'count'=>count($consultation), 'patient_ids'=>$patient_ids];
|
|
|
|
}
|
|
return view('reports::mental_health_reports.diagnosed_patients', compact('start_date', 'end_date', 'reports'));
|
|
}
|
|
|
|
public function persons_taking_psychotropic_drugs(Request $request){
|
|
|
|
// get array of accepted drugs
|
|
$drugs = Drug::whereIn('category_id', [13,27,32,37,46,53])->pluck('id', 'id')->toArray();
|
|
$drugs = array_fill_keys(array_keys($drugs), 0);
|
|
$drug_patient_id = [];
|
|
if (isset($request->start_date)){
|
|
$start_date = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString();
|
|
$end_date = Carbon::parse($request->end_date)->endOfDay()->toDateTimeString();
|
|
} else {
|
|
$start_date = Carbon::now()->startOfDay()->toDateTimeString();
|
|
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
|
|
}
|
|
|
|
// get all diagnoses with hmis category mental health
|
|
$diagnoses = Diagnosis::where('hmis_category', 8)->get()->toArray();
|
|
|
|
foreach ($diagnoses as $diagnosis){
|
|
$consultations = Consultation::where('primary_diagnosis', $diagnosis['id'])->whereBetween('created_at', [$start_date, $end_date])->get();
|
|
|
|
foreach ($consultations as $consultation){
|
|
$patient_id = $consultation->patient_id;
|
|
$episode_id = $consultation->episode_id;
|
|
|
|
// select treatments
|
|
$treatments = Treatment::where('patient_id', $patient_id)->where('episode_id', $episode_id)->get();
|
|
|
|
foreach ($treatments as $treatment){
|
|
$ordered_drugs_array = explode(",", $treatment->drugs);
|
|
|
|
// i'm tired of foreach's
|
|
foreach ($ordered_drugs_array as $record){
|
|
if (key_exists($record, $drugs)){
|
|
$drugs[$record]++;
|
|
$drug_patient_id[$record]['patient_ids'][]= $patient_id;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return view('reports::mental_health_reports.persons_taking_psychotropic_drugs', compact('drugs', 'start_date','drug_patient_id', 'end_date'));
|
|
}
|
|
|
|
public function diagnosed_persons_who_received_treatment(Request $request){
|
|
if (isset($request->start_date)){
|
|
$start_date = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString();
|
|
$end_date = Carbon::parse($request->end_date)->endOfDay()->toDateTimeString();
|
|
} else {
|
|
$start_date = Carbon::now()->startOfDay()->toDateTimeString();
|
|
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
|
|
}
|
|
|
|
// get all diagnoses with hmis category mental health
|
|
$diagnoses = Diagnosis::where('hmis_category', 8)->get()->toArray();
|
|
|
|
$reports = [];
|
|
$reports_counter = 0;
|
|
|
|
foreach ($diagnoses as $diagnosis){
|
|
$consultations = Consultation::where('primary_diagnosis', $diagnosis['id'])->whereBetween('created_at', [$start_date, $end_date])->get();
|
|
$reports[$reports_counter]['name'] = $diagnosis['name'];
|
|
$reports[$reports_counter]['number_of_patients'] = count($consultations);
|
|
$patient_ids = $treated_patient_ids =[];
|
|
|
|
$patients_who_received_treatment = 0;
|
|
|
|
foreach ($consultations as $consultation){
|
|
// select treatments
|
|
$treatments = Treatment::where('patient_id', $consultation->patient_id)->where('episode_id', $consultation->episode_id)->get();
|
|
|
|
if (count($treatments) > 0){
|
|
// patient received treatment
|
|
$patients_who_received_treatment++;
|
|
foreach($treatments as $treatment) $treated_patient_ids[] = $treatment->patient_id;
|
|
}
|
|
$patient_ids[]= $consultation->patient_id;
|
|
}
|
|
|
|
$reports[$reports_counter]['number_of_patients_with_treatment'] = $patients_who_received_treatment;
|
|
$reports[$reports_counter]['patient_ids'] = $patient_ids;
|
|
$reports[$reports_counter]['treated_patient_ids'] = $treated_patient_ids;
|
|
|
|
$reports_counter++;
|
|
}
|
|
return view('reports::mental_health_reports.diagnosed_persons_who_received_treatment', compact('reports', 'start_date', 'end_date'));
|
|
}
|
|
|
|
public function patients_lost_to_follow_up(Request $request) {
|
|
if (isset($request->start_date)){
|
|
$start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->toDateString();
|
|
$end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->toDateString();
|
|
} else {
|
|
$start_date = Carbon::now()->startOfDay()->toDateTimeString();
|
|
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
|
|
}
|
|
|
|
// get all diagnoses with hmis category mental health
|
|
$diagnoses = Diagnosis::where('hmis_category', 8)->pluck('id')->toArray();
|
|
|
|
$follow_ups = $number_of_patients_lost_ids = $total_follow_ups_ids = [];
|
|
$number_of_patients_lost = 0;
|
|
$total_follow_ups = 0;
|
|
|
|
$lost_follow_ups = PatientAppointment::whereBetween('appointment_date', [$start_date, $end_date])->get();
|
|
|
|
foreach ($lost_follow_ups as $record) {
|
|
$consultation = Consultation::where('episode_id', $record->episode_id)->first();
|
|
|
|
if ($consultation && in_array($consultation->primary_diagnosis, $diagnoses)){
|
|
|
|
if ($record->appointment_fulfilled == 0){
|
|
$follow_ups[$number_of_patients_lost]['patient_id']= $number_of_patients_lost_ids[] = $record->patient_id;
|
|
$follow_ups[$number_of_patients_lost]['created_at'] = $record->created_at;
|
|
$follow_ups[$number_of_patients_lost]['appointment_date'] = $record->appointment_date;
|
|
$number_of_patients_lost++;
|
|
}
|
|
$total_follow_ups++;
|
|
$total_follow_ups_ids[]= $record->patient_id;
|
|
}
|
|
}
|
|
|
|
$number_of_patients_followed_up = $total_follow_ups - $number_of_patients_lost;
|
|
$number_of_patients_followed_up_ids = array_diff($total_follow_ups_ids, $number_of_patients_lost_ids);
|
|
$drop_out_rate = $total_follow_ups > 0 ? ($number_of_patients_lost / $total_follow_ups) * 100 : 0;
|
|
|
|
return view('reports::mental_health_reports.patients_lost_to_follow_up', compact('follow_ups', 'start_date', 'end_date', 'total_follow_ups', 'number_of_patients_followed_up', 'number_of_patients_lost', 'drop_out_rate','number_of_patients_followed_up_ids','number_of_patients_lost_ids', 'total_follow_ups_ids'));
|
|
}
|
|
|
|
public function days_drugs_out_of_stock(Request $request) {
|
|
|
|
$drugs = DB::table('drugs')->where('available', 1)->whereNull('deleted_at')
|
|
->whereIn('category_id', [13,27,32,37,46,53])
|
|
->pluck('id')->toArray();
|
|
|
|
if (isset($request->start_date)) {
|
|
$start_date = Carbon::createFromFormat('d/m/Y', $request->start_date);
|
|
$end_date = Carbon::createFromFormat('d/m/Y', $request->end_date);
|
|
} else {
|
|
$start_date = Carbon::now();
|
|
$end_date = Carbon::now();
|
|
}
|
|
|
|
$selected_drugs = [];
|
|
|
|
$stock_watcher_records = DB::table('stock_watcher')
|
|
->where('item_type', 1)
|
|
->whereIn('item_id', $drugs)
|
|
->get();
|
|
|
|
foreach ($stock_watcher_records as $record) {
|
|
$start_date_search = clone $start_date; // or you can use $start_date->copy()
|
|
$end_date_search = clone $end_date;
|
|
|
|
$details_arr = json_decode($record->details, true);
|
|
|
|
// keep incrementing the start date till it reaches the next day after the end date and stop
|
|
while (!$start_date_search->isAfter($end_date_search)) {
|
|
if (isset($details_arr[$start_date_search->toDateString()]) && $details_arr[$start_date_search->toDateString()]["pharmacy_stock"] < 1 && $details_arr[$start_date_search->toDateString()]["store_stock"] < 1) {
|
|
$selected_drugs[$record->item_id] = 1 + ($selected_drugs[$record->item_id] ?? 0);
|
|
}
|
|
|
|
$start_date_search->addDay();
|
|
}
|
|
}
|
|
|
|
return view('reports::mental_health_reports.days_drugs_out_of_stock', compact('selected_drugs', 'start_date', 'end_date'));
|
|
}
|
|
}
|