Files
streamline-emr/docker/streamline-src/Modules/Reports/Http/Controllers/MentalHealthReportsController.php

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'));
}
}