Files

496 lines
22 KiB
PHP
Executable File

<?php
namespace Modules\ClinicalData\Http\Controllers;
use Illuminate\Http\Request;
use Streamline\Models\Diagnosis;
use Streamline\Models\Consultation;
use Streamline\Models\InpatientInfo;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\QueryException;
use Streamline\Models\DiagnosisCategory;
use Streamline\Models\InsuranceTariff;
use Streamline\Models\HmisCategory;
use Streamline\Models\HmisCategoryOptions;
class DiagnosisController extends Controller {
public function __construct() {
$this->middleware('auth');
$this->middleware('permission:diagnosis-list', ['only' => ['index']]);
$this->middleware('permission:diagnosis-create', ['only' => ['create', 'store']]);
$this->middleware('permission:diagnosis-edit', ['only' => ['edit', 'update', 'edit_all', 'update_all']]);
$this->middleware('permission:diagnosis-delete', ['only' => ['destroy', 'inactive', 'activate']]);
}
/**
* Display a listing of the resource.
*
*/
public function index() {
$diagnoses = Diagnosis::orderBy('name', 'asc')->leftJoin('hmis_category_options as h', 'h.id', 'diagnoses.hmis_no_inpatient')
->select('diagnoses.*', 'h.number as inpatient_number')
->paginate(10000);
$hmis_categories = DB::table('hmis_categories')
->orderBy('title', 'asc')
->pluck('title', 'id');
$issued_diagnoses = [];
$hmis_category_options = HmisCategoryOptions::orderBy('name', 'asc')->pluck('name', 'id');
$consultations_primary = Consultation::distinct('primary_diagnosis')->select('primary_diagnosis');
$inpatient_primary = InpatientInfo::distinct('primary_diagnosis')->select('primary_diagnosis')->union($consultations_primary)->get()->toArray();
foreach($inpatient_primary as $diagnosis) if(!in_array($diagnosis['primary_diagnosis'], $issued_diagnoses) && !empty($diagnosis['primary_diagnosis'])) $issued_diagnoses[]=$diagnosis['primary_diagnosis'];
$consultations_other = Consultation::distinct('other_diagnoses')->select('other_diagnoses');
$inpatient_other = InpatientInfo::distinct('other_diagnoses')->select('other_diagnoses')->union($consultations_other)->get();
foreach($inpatient_other as $diagnosis_other) {
$other_diagnoses = unserialize($diagnosis_other->other_diagnoses);
if(!empty($other_diagnoses)) foreach($other_diagnoses as $other_diagnosis) if(!in_array(intval($other_diagnosis), $issued_diagnoses)) $issued_diagnoses[]= intval($other_diagnosis);
}
return view('clinical_data::diagnoses.index', compact('diagnoses', 'hmis_categories','issued_diagnoses', 'hmis_category_options'));
}
/**
* Show the form for creating a new resource.
*
*/
public function create() {
$hmis_categories = DB::table('hmis_categories')->whereIn('section_number',[6,7,1])->orderBy('title', 'asc')->get();
$inpatient_hmis_categories = $hmis_categories->filter(function($hmis_category){
return $hmis_category->type == 1;
})->pluck('title', 'id')->prepend('- Select HMIS Inpatient Category -', '');
$outpatient_hmis_categories = $hmis_categories->filter(function($hmis_category){
return $hmis_category->type == 0;
})->pluck('title', 'id')->prepend('- Select HMIS Outpatient Category -', '');
$parent_categories = array_unique(HmisCategoryOptions::where('parent_option', '<>','')->pluck('parent_option')->toArray());
$diagnosis_categories = DiagnosisCategory::orderBy('name', 'asc')->pluck('name', 'id')->prepend('None', 0);
$insurance_tariffs = DB::table('insurance_tariffs')->whereNull('deleted_at')->pluck('name', 'id')->toArray();
return view('clinical_data::diagnoses.create', compact('hmis_categories', 'insurance_tariffs','parent_categories', 'inpatient_hmis_categories', 'outpatient_hmis_categories', 'diagnosis_categories'));
}
/**
* Store a newly created resource in storage.
*
*/
public function store(Request $request) {
request()->validate([
'name' => 'required|unique:diagnoses'
]);
$logged_in_user_id = Auth()->user()->id;
$diagnosis = new Diagnosis;
//Reference Names
$reference_names_array = $request->reference_names;
$reference_names = "";
//Processing reference areas
$reference_areas_array = $request->reference_areas;
$reference_areas = "";
if ($request->insurance_tariffs) {
$diagnosis->insurance_tariffs = implode(",", $request->insurance_tariffs);
}
for ($x = 0; $x < count($reference_areas_array); $x++):
$reference_area = $reference_areas_array[$x];
$reference_area_data = parse_url($reference_area);
if (empty($reference_area_data['scheme'])):
$reference_area = 'http://' . ltrim($reference_area, '/');
endif;
$reference_areas .= $reference_area . ",";
$reference_names .= rtrim($reference_names_array[$x], ", ") . ",";
endfor;
if (!empty($request->district_code) && $request->outpatient_hmis_category_option == '655') {
$district_code = HmisCategoryOptions::updateOrCreate(['name' => $request->district_code,'number' => 'Code', 'hmis_category_id' => 0],[
'name' => $request->district_code,
'number' => 'Code',
'hmis_category_id' => 0,
'parent_option' => $request->outpatient_hmis_category_option,
'created_by' => Auth()->user()->id
]);
}
$diagnosis->name = $request->name;
$diagnosis->icd10_code = $request->icd10_code;
$diagnosis->available = $request->available;
// $diagnosis->hmis_no_outpatient = $request->hmis_no_outpatient;
$diagnosis->hmis_no_inpatient = $request->hmis_no_inpatient;
$diagnosis->prompts = $request->prompts;
$diagnosis->diagnosis_category = $request->diagnosis_category?? null;
$diagnosis->chronic_status = $request->chronic_status;
$diagnosis->reference_areas = rtrim($reference_areas, ", ");
$diagnosis->reference_names = rtrim($reference_names, ", ");
$diagnosis->hmis_category = $request->hmis_category;
$diagnosis->dependent_option = $request->parent_dependent_option ?? null;
$diagnosis->outpatient_hmis_category = $request->outpatient_hmis_category ?? null;
$diagnosis->outpatient_hmis_category_option = $request->outpatient_hmis_category_option ?? null;
if(!empty($district_code->id)) $diagnosis->outpatient_dependent_option = $district_code->id;
else $diagnosis->outpatient_dependent_option = $request->outpatient_dependent_option ?? null;
$diagnosis->created_by = $logged_in_user_id;
try {
$diagnosis->save();
if ($request->insurance_tariffs) {
// add diagnoses to the tariffs
foreach ($request->insurance_tariffs as $tariff_id) {
try {
$tariff = InsuranceTariff::find($tariff_id);
if ($tariff->linked_diagnoses) {
$current_diagnoses = explode(",", $tariff->linked_diagnoses);
$current_diagnoses = array_merge($current_diagnoses, $diagnosis->id);
} else {
$current_diagnoses = [$diagnosis->id];
}
$tariff->linked_diagnoses = implode(",", $current_diagnoses);
$tariff->save();
} catch (\Exception $exception) {}
}
}
flash($request->name . " Diagnosis has been saved")->success();
return redirect("/diagnoses/");
} catch (QueryException $e) {
flash("An error occurred!")->error();
return back()->withInput();
}
}
/**
* Display the specified resource.
*
* @param int $id
*/
public function show($id) {
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
*/
public function edit($id) {
$diagnosis = Diagnosis::findOrFail($id);
$hmis_categories = HmisCategory::whereIn('section_number',[6,7,1])->orderBy('title', 'asc')->get();
$diagnosis_categories = DiagnosisCategory::orderBy('name', 'asc')->pluck('name', 'id')->prepend('None', 0);
$parent_categories = array_unique(HmisCategoryOptions::where('parent_option', '<>','')->pluck('parent_option')->toArray());
$insurance_tariffs = DB::table('insurance_tariffs')->whereNull('deleted_at')->pluck('name', 'id')->toArray();
$inpatient_category_options_header = (!empty($diagnosis->hmis_no_inpatient) || $diagnosis->hmis_no_inpatient == '-')? '- Select HMIS Inpatient Category Option -': '- Firstly, Select HMIS Inpatient Category -';
$outpatient_category_options_header = !empty($diagnosis->outpatient_hmis_category)? '- Select HMIS Outpatient Category Option -': '- Firstly, Select HMIS Outpatient Category -';
$dependent_options_header = '- Select Dependent Option -';$inpatient_category_options = $outpatient_dependent_options = $dependent_options = $outpatient_category_options =[];
if(!empty($diagnosis->hmis_no_inpatient) || $diagnosis->hmis_no_inpatient == '-') $inpatient_category_options = HmisCategoryOptions::where('hmis_category_id', $diagnosis->hmis_category)->pluck('name','id')->prepend($inpatient_category_options_header, '');
if(!empty($diagnosis->outpatient_hmis_category)) $outpatient_category_options = HmisCategoryOptions::where('hmis_category_id', $diagnosis->outpatient_hmis_category)->pluck('name','id')->prepend($outpatient_category_options_header, '');
if(!empty($diagnosis->hmis_no_inpatient) || $diagnosis->hmis_no_inpatient == '-' || in_array($diagnosis->hmis_no_inpatient, $parent_categories)) $dependent_options = HmisCategoryOptions::where('parent_option', $diagnosis->hmis_no_inpatient)->pluck('name','id')->prepend($dependent_options_header, '');
if(!empty($diagnosis->outpatient_hmis_category_option) || in_array($diagnosis->outpatient_hmis_category_option, $parent_categories)) $outpatient_dependent_options = HmisCategoryOptions::where('parent_option', $diagnosis->outpatient_hmis_category_option)->pluck('name','id')->prepend($dependent_options_header, '');
$inpatient_hmis_categories = $hmis_categories->filter(function($hmis_category){
return $hmis_category->type == 1;
})->pluck('title', 'id')->prepend('- Select HMIS Inpatient Category -', '');
$outpatient_hmis_categories = $hmis_categories->filter(function($hmis_category){
return $hmis_category->type == 0;
})->pluck('title', 'id')->prepend('- Select HMIS Outpatient Category -', '');
return view('clinical_data::diagnoses.edit', compact('diagnosis', 'inpatient_hmis_categories', 'insurance_tariffs', 'outpatient_hmis_categories', 'outpatient_category_options', 'diagnosis_categories', 'inpatient_category_options', 'dependent_options', 'parent_categories', 'outpatient_dependent_options'));
}
/**
* Update the specified resource in storage.
*
*/
public function update(Request $request, $id) {
request()->validate([
'name' => 'required|unique:diagnoses,name,'.$id
]);
$logged_in_user_id = Auth()->user()->id;
//Reference Names
$reference_names_array = $request->reference_names;
$reference_names = "";
//Processing reference areas
$reference_areas_array = $request->reference_areas;
$reference_areas = "";
if (!empty($reference_areas_array)) {
for ($x = 0; $x < count($reference_areas_array); $x++):
$reference_area = $reference_areas_array[$x];
$reference_area_data = parse_url($reference_area);
if (empty($reference_area_data['scheme'])):
$reference_area = 'http://' . ltrim($reference_area, '/');
endif;
$reference_areas .= $reference_area . ",";
$reference_names .= rtrim($reference_names_array[$x], ", ") . ",";
endfor;
}
if (!empty($request->district_code) && $request->outpatient_hmis_category_option == '655') {
$district_code = HmisCategoryOptions::updateOrCreate(['id' => $request->district_code_id,'number' => 'Code', 'hmis_category_id' => 0],[
// 'id'=>$hmis_category_option['id'],
'name' => $request->district_code,
'number' => 'Code',
'hmis_category_id' => 0,
'parent_option' => $request->outpatient_hmis_category_option,
'created_by' => Auth()->user()->id
]);
}
$diagnosis = Diagnosis::find($id);
$diagnosis->name = $request->name;
$diagnosis->icd10_code = $request->icd10_code;
$diagnosis->available = $request->available;
// $diagnosis->hmis_no_outpatient = $request->hmis_no_outpatient;
$diagnosis->hmis_no_inpatient = $request->hmis_no_inpatient;
$diagnosis->prompts = $request->prompts;
$diagnosis->chronic_status = $request->chronic_status;
$diagnosis->reference_areas = rtrim($reference_areas, ", ");
$diagnosis->reference_names = rtrim($reference_names, ", ");
$diagnosis->hmis_category = $request->hmis_category;
$diagnosis->diagnosis_category = $request->diagnosis_category?? null;
$diagnosis->dependent_option = $request->parent_dependent_option ?? null;
$diagnosis->outpatient_hmis_category = $request->outpatient_hmis_category ?? null;
$diagnosis->outpatient_hmis_category_option = $request->outpatient_hmis_category_option ?? null;
if(!empty($district_code->id) && $request->outpatient_hmis_category_option == '655') $diagnosis->outpatient_dependent_option = $district_code->id;
else $diagnosis->outpatient_dependent_option = $request->outpatient_dependent_option ?? null;
$diagnosis->updated_by = $logged_in_user_id;
if ($request->insurance_tariffs) {
$original_tariffs = explode(",", $diagnosis->insurance_tariffs);
$diagnosis->insurance_tariffs = implode(",", $request->insurance_tariffs);
$removed_tariffs = array_diff($original_tariffs, $request->insurance_tariffs);
$added_tariffs = array_diff($request->insurance_tariffs, $original_tariffs);
// add diagnoses to the tariffs
foreach ($added_tariffs as $tariff_id) {
try {
$tariff = InsuranceTariff::find($tariff_id);
if ($tariff->linked_diagnoses) {
$current_diagnoses = explode(",", $tariff->linked_diagnoses);
$current_diagnoses = array_merge($current_diagnoses, $diagnosis->id);
} else {
$current_diagnoses = [$diagnosis->id];
}
$tariff->linked_diagnoses = implode(",", $current_diagnoses);
$tariff->save();
} catch (\Exception $exception) {}
}
// remove diagnosis from tariffs
foreach ($removed_tariffs as $tariff_id) {
try {
$tariff = InsuranceTariff::find($tariff_id);
$current_diagnoses = explode(",", $tariff->linked_diagnoses);
if (in_array($diagnosis->id, $current_diagnoses)) {
unset($current_diagnoses[array_search($diagnosis->id, $current_diagnoses)]);
$tariff->linked_diagnoses = implode(",", $current_diagnoses);
$tariff->save();
}
} catch (\Exception $exception) {}
}
}
try {
$diagnosis->save();
flash($request->name . " Diagnosis has been updated")->success();
return redirect("/diagnoses/");
} catch (QueryException $e) {
flash("An error occurred!")->error();
return back()->withInput();
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id) {
$diagnosis = Diagnosis::find($id);
if ($diagnosis->delete()){
flash("Diagnosis has been deleted.")->success();
return redirect('/diagnoses/');
}
}
/**
* Display a listing of the inactive resource(s).
*
* @return \Illuminate\Http\Response
*/
public function inactive() {
$diagnoses = Diagnosis::onlyTrashed()
->orderBy('name', 'asc')
->paginate(50);
$hmis_categories = DB::table('hmis_categories')
->orderBy('title', 'asc')
->pluck('title', 'id');
if (empty($diagnoses)) {
flash()->error("There is no inactive diagnosis");
return redirect('/diagnoses/');
} else {
return view('clinical_data::diagnoses.inactive', compact('diagnoses', 'hmis_categories'));
}
}
/**
* Activate the specified resource in storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function activate($id) {
$diagnosis = Diagnosis::withTrashed()->find($id);
if ($diagnosis->restore()){
flash("Diagnosis has been activated.")->success();
return redirect('/diagnoses/inactive');
}
}
/**
* Display a listing of the active resources for bulk editing.
*
* @return \Illuminate\Http\Response
*/
public function edit_all() {
$diagnoses = Diagnosis::orderBy('name', 'asc')
->get();
$hmis_categories = DB::table('hmis_categories')
->pluck('title', 'id')
->toArray();
$hmis_categories = ['' => '- select -'] + $hmis_categories;
if (count($diagnoses) < 1) {
flash()->error("There is no active diagnosis");
return redirect('/diagnoses/');
} else {
return view('clinical_data::diagnoses.edit.all', compact('diagnoses', 'hmis_categories'));
}
}
/**
* Update all the resources in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update_all(Request $request) {
$validator = Validator::make($request->all(), [
'name' => 'required'
]);
if ($validator->fails()) {
$string = "";
foreach ($validator->errors()->getMessages() as $item) {
$string .= "{$item[0]}<br>";
}
// flash($string)->error();
return back()->withErrors($validator)->withInput();
} else {
$logged_in_user_id = Auth()->user()->id;
$id_array = $request->id;
$name_array = $request->name;
$icd10_code_array = $request->icd10_code;
$hmis_no_outpatient_array = $request->hmis_no_outpatient;
$hmis_no_inpatient_array = $request->hmis_no_inpatient;
$prompts_array = $request->prompts;
$chronic_status_array = $request->chronic_status;
$reference_areas_array = $request->reference_areas;
$reference_names_array = $request->reference_names;
$hmis_category_array = $request->hmis_category;
for ($x = 0; $x < count($id_array); $x++):
$diagnosis = Diagnosis::find($id_array[$x]);
$diagnosis->name = $name_array[$x];
$diagnosis->icd10_code = $icd10_code_array[$x];
$diagnosis->hmis_no_outpatient = $hmis_no_outpatient_array[$x];
$diagnosis->hmis_no_inpatient = $hmis_no_inpatient_array[$x];
$diagnosis->prompts = $prompts_array[$x];
$diagnosis->chronic_status = $chronic_status_array[$x];
$diagnosis->reference_areas = rtrim($reference_areas_array[$x], ", ");
$diagnosis->reference_names = rtrim($reference_names_array[$x], ", ");
$diagnosis->hmis_category = $hmis_category_array[$x];
$diagnosis->updated_by = $logged_in_user_id;
try {
$diagnosis->save();
} catch (QueryException $e) {
flash("An error occurred")->error();
return back()->withInput();
}
endfor;
flash("Diagnoses have been updated")->success();
return redirect("/diagnoses/");
}
}
public function get_diagnosis(Request $request) {
$diagnosis_id = $request->diagnosis_id;
$diagnosis = Diagnosis::where('id', $diagnosis_id)->first();
$reference_areas_array = explode(",", $diagnosis->reference_areas);
$reference_names_array = explode(",", $diagnosis->reference_names);
$prompt = empty($diagnosis->prompts) ? "&nbsp" : $diagnosis->prompts;
$links = "";
for ($x = 0; $x < count($reference_areas_array); $x++) {
if (isset($reference_areas_array[$x]) && isset($reference_names_array[$x])){
$links .= "<a href='" . $reference_areas_array[$x] . "' target='_blank' >" . $reference_names_array[$x] . "</a> <span style='color: red'> | </span>";
}
}
return $prompt . "&&" . $links;
}
public function get_diagnosis_by_category($category){
$code = "<option> - select - </option>";
$diagnoses = Diagnosis::where('diagnosis_category', $category)->orderBy('name', 'asc')->get();
foreach ($diagnoses as $diagnosis) {
$code .= "<option value='" . $diagnosis->id . "'>" . $diagnosis->name . "</option>";
}
$code .= "</select>";
return $code;
}
public function get_diagnosis_categories(){
$diagnoses = DiagnosisCategory::all();
$code = "<option> - select - </option>";
foreach ($diagnoses as $diagnosis) {
$code .= "<option value='" . $diagnosis->id . "'>" . $diagnosis->name . "</option>";
}
$code .= "</select>";
return $code;
}
}