Files
streamline-emr/docker/streamline-src/Modules/Patients/Http/Controllers/PatientController.php
T
alec.turner a424394109 Build modified streamline images
The official image from streamline does not currently work for the arm64
platform. As a temporary measure, the source code and docker build scripts
have been lifted from the official images and are used to build locally.

Some additional modifications are made to reduce overall image size, these
are documented in docker/README.md
2024-03-10 16:17:50 -07:00

2259 lines
103 KiB
PHP
Executable File

<?php
namespace Modules\Patients\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Streamline\Models\Clinic;
use Streamline\Models\Consultation;
use Streamline\Models\Country;
use Streamline\Models\County;
use Streamline\Models\District;
use Streamline\Models\FamilyRelationship;
use Streamline\Models\MaritalStatus;
use Streamline\Models\Parish;
use Streamline\Models\Patient;
use Illuminate\Support\Facades\Validator;
use Streamline\Models\Occupation;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Streamline\Models\HospitalInformation;
use Streamline\Models\PatientAppointment;
use Streamline\Models\PatientCategory;
use Streamline\Models\PatientEpisode;
use Streamline\Models\Religion;
use Streamline\Models\Subcounty;
use Streamline\Models\Triage;
use Streamline\Models\User;
use Streamline\Models\Village;
use Streamline\Models\Company;
use Streamline\Models\PatientDeactivationReason;
use Illuminate\Support\Facades\Http;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Illuminate\Database\QueryException;
class PatientController extends Controller {
function __construct() {
$this->middleware('auth');
$this->middleware('permission:patient-list', ['only' => ['index', 'select']]);
$this->middleware('permission:patient-detail', ['only' => ['show']]);
$this->middleware('permission:patient-create', ['only' => ['create', 'store']]);
$this->middleware('permission:patient-edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:patient-delete', ['only' => ['destroy']]);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index() {
$patientCount = Patient::count();
$patients = Patient::orderBy('created_at', 'desc')->paginate(100);
$categories = PatientCategory::pluck("name", "id");
$marital_statuses = MaritalStatus::pluck("name", "id");
$patient_villages = Village::pluck("name", "id");
$patient_numbers = Patient::orderBy('number')->distinct()->pluck('number');
$first_names = [];//Patient::orderBy('first_name')->distinct()->pluck('first_name');
$last_names = [];//Patient::orderBy('last_name')->distinct()->pluck('last_name');
$villages = Village::orderBy('name')->distinct()->pluck('name');
$full_names = Patient::all(['first_name', 'last_name', 'number', 'phone'])->pluck("full_name");
return view('patients::patients.index', compact('patients', 'patientCount', 'categories', 'marital_statuses', 'patient_villages', 'patient_numbers', 'first_names', 'last_names', 'villages', 'full_names'))
->with('i', (request()->input('page', 1) - 1) * 5);
}
/**
* Show the form for creating a new resource.
*
*/
public function create() {
$occupations = Occupation::orderBy('name')->pluck('name', 'id')->toArray();
$patient_categories = PatientCategory::where('available', 1)->orderby('name')->pluck('name', 'id')->toArray();
//$districts = District::orderBy('name')->pluck('name', 'id')->toArray();
$marital_statuses = MaritalStatus::pluck('name', 'id')->toArray();
$religions = Religion::orderBy('name')->pluck('name', 'id')->toArray();
$relationships = FamilyRelationship::orderBy('name')->pluck('name', 'id')->toArray();
$occupations = ['' => '- select -'] + $occupations;
$districts = [];// ['' => '- select -'] + $districts;
$religions = ['' => '- select -'] + $religions;
$relationships = ['' => '- select -'] + $relationships;
$dynamic_counties = [];// County::all(['id', 'name', 'district_id'])->pluck("name_with_district", "id")->prepend('- select -', '')->toArray();
$dynamic_sub_counties = [];// Subcounty::all(['id', 'name', 'county_id'])->pluck("name_with_county", "id")->prepend('- select -', '')->toArray();
$dynamic_parishes = []; // Parish::all(['id', 'name', 'subcounty_id'])->pluck("name_with_subcounty", "id")->prepend('- select -', '')->toArray();
$countries = DB::table('countries')->pluck('name','id')->prepend('- Select country of origin - ', '');
$companies = Company::orderBy('name')->pluck("name", "id")->toArray();
$companies = ['' => '- select -'] + $companies;
return view('patients::patients.create', compact('occupations', 'patient_categories', 'districts', 'marital_statuses', 'religions', 'relationships', 'dynamic_counties', 'dynamic_sub_counties', 'dynamic_parishes', 'countries', 'companies'));
}
/**
* Store a newly created resource in storage.
*
*/
public function store(Request $request) {
request()->validate([
'first_name' => 'required',
'last_name' => 'required',
'gender' => 'required',
'date_of_birth' => 'required_without:age_in_years',
'age_in_years' => 'required_without:date_of_birth',
/*'national_id' => 'max:15|unique:patients',*/
'patient_category' => 'required'
]);
// check if a patient's national_id is in the system already..
$patient_exists = Patient::where('national_id', $request->national_id)->pluck('national_id')->first();
if(is_null($patient_exists)){
$patient = new Patient;
$patient->first_name = $request->first_name;
$patient->last_name = $request->last_name;
$calculated_date_of_birth = null;
if (is_null($request->date_of_birth)) {
$age_in_years = $request->age_in_years;
$calculated_dob = \Carbon\Carbon::now()->subYears($age_in_years);
$calculated_date_of_birth = $calculated_dob->toDateString();
$patient->date_of_birth = $calculated_date_of_birth;
} else {
$patient->date_of_birth = Carbon::createFromFormat('d/m/Y', $request->date_of_birth)->toDateString();
}
$patient->marital_status = $request->marital_status;
$patient->occupation_id = $request->occupation;
$patient->religion_id = $request->religion;
$patient->category_id = $request->patient_category;
$patient->company_id = $request->company;
$patient->citizenship = $request->citizenship;
$patient->country_id = $request->country_id;
$residence_array = explode(",", $request->residence);
$patient->district_id = $residence_array[4] ?? 0;
$patient->county_id = $residence_array[3] ?? 0;
$patient->subcounty_id = $residence_array[2] ?? 0;
$patient->parish_id = $residence_array[1] ?? 0;
$patient->village_id = $residence_array[0] ?? 0;
$patient->address_details = $request->residence;
$patient->gender = $request->gender;
$patient->next_of_kin = $request->next_of_kin;
$patient->next_of_kin_relationship = $request->next_of_kin_relationship;
$patient->phone_of_next_of_kin = removeSpaces($request->next_of_kin_phone);
$patient->phone = removeSpaces($request->phone);
$patient->alternative_phone = removeSpaces($request->alternative_phone);
$patient->national_id = $request->national_id;
$patient->phone_owner = $request->phone_owner; // problem
$patient->hospital_contact = $request->hospital_contact;
$patient->language = $request->language;
$patient->lc_one = $request->lc_one;
$patient->fingerprint_template = $request->fingerprint_template ?? NULL;
$patient->created_by = Auth::user()->id;
if ($patient->save()):
$prefix = DB::table('hospital_information')->where('id', 1)->value('patient_number_abbr');
$new_id = quadLimit($patient->id);
$patient_number = $prefix . "-" . $new_id;
DB::table('patients')->where('id', $new_id)->update(['number' => $patient_number]); // Updating the patient number
flash('Patient with patient number ' . $patient_number . ' has been successfully registered')->success();
return redirect('/patient_episodes/set_patient_id/' . $patient->id);
else:
flash("There was an error")->error();
return redirect()->back()->withInput();
endif;
} else {
flash("Patient With This National ID Number is already Registered")->error();
return redirect()->back()->withInput();
}
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id) {
$patient = Patient::withTrashed()->find($id);
$districts = DB::table('districts')->pluck('name', 'id');
$counties = DB::table('counties')->pluck('name', 'id');
$subcounties = DB::table('subcounties')->pluck('name', 'id');
$parishes = DB::table('parishes')->pluck('name', 'id');
$villages = DB::table('villages')->pluck('name', 'id');
$occupations = DB::table('occupations')->pluck('name', 'id');
$religions = DB::table('religions')->pluck('name', 'id');
$relationships = DB::table('family_relations')->pluck('name', 'id');
$last_episode = PatientEpisode::where('id',$id)->orderBy('created_at', 'desc')->first();
return view('patients::patients.show', compact('patient', 'districts', 'counties', 'subcounties', 'parishes', 'villages', 'occupations', 'religions', 'relationships', 'last_episode'));
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
*/
public function edit($id) {
$patient = Patient::where(['id' => $id])->first();
if (is_null($patient->date_of_birth)) {
$dob = "01/01/2020";
} else {
$dob = date_format($patient->date_of_birth, 'd/m/Y');
}
$episodes = PatientEpisode::distinct('patient_id')->pluck('patient_id')->toArray();
$occupations = Occupation::orderBy('name')->pluck('name', 'id')->toArray();
$patient_categories = PatientCategory::where('available', 1)->orderby('name')->pluck('name', 'id')->toArray();
$districts = DB::table('districts')->whereNull('deleted_at')->orderBy('name')->pluck('name', 'id')->toArray();
$religions = Religion::orderBy('name')->pluck('name', 'id')->toArray();
$relationships = FamilyRelationship::orderBy('name')->pluck('name', 'id')->toArray();
$occupations = ['' => '- select -'] + $occupations;
$districts = ['' => '- select -'] + $districts;
$religions = ['' => '- select -'] + $religions;
$relationships = ['' => '- select -'] + $relationships;
$marital_statuses = DB::table('marital_statuses')->whereNull('deleted_at')->pluck('name', 'id');
$countries = DB::table('countries')->whereNull('deleted_at')->pluck('name','id')->prepend('- Select country of origin - ', '');
$companies = Company::orderBy('name')->pluck("name", "id")->toArray();
$companies = ['' => '- select -'] + $companies;
return view('patients::patients.edit', compact('patient', 'occupations', 'dob', 'patient_categories', 'episodes', 'districts', 'marital_statuses', 'religions', 'relationships', 'countries', 'companies'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id) {
request()->validate([
'first_name' => 'required',
'last_name' => 'required',
'date_of_birth' => 'required_without:age_in_years',
'age_in_years' => 'required_without:date_of_birth',
//'national_id' => 'max:15',
'patient_category' => 'required'
], [
'first_name.required' => 'Please enter first name'
]
);
$patient = Patient::find($id);
$patient->first_name = $request->first_name;
$patient->last_name = $request->last_name;
$calculated_date_of_birth = null;
if (is_null($request->date_of_birth)) {
$age_in_years = $request->age_in_years;
$calculated_dob = \Carbon\Carbon::now()->subYears($age_in_years);
$calculated_date_of_birth = $calculated_dob->toDateString();
$patient->date_of_birth = $calculated_date_of_birth;
} else {
$patient->date_of_birth = Carbon::createFromFormat('d/m/Y', $request->date_of_birth)->toDateString();
}
$patient->marital_status = $request->marital_status;
$patient->occupation_id = $request->occupation;
$patient->religion_id = $request->religion;
$patient->category_id = $request->patient_category;
$patient->company_id = $request->company;
$patient->citizenship = $request->citizenship;
$patient->country_id = $request->country_id;
/*=========*/
// split the residence values
$residence_array = explode(",", $request->residence);
$patient->district_id = isset($residence_array[4]) ? $residence_array[4] : 0;
$patient->county_id = isset($residence_array[3])? $residence_array[3] : 0;
$patient->subcounty_id = isset($residence_array[2]) ? $residence_array[2] : 0;
$patient->parish_id = isset($residence_array[1]) ? $residence_array[1] : 0;
$patient->village_id = isset($residence_array[0]) ? $residence_array[0] : 0;
//for now put the residences string into address_details but ask douglas what it was meant for
$patient->address_details = $request->residence;
$patient->gender = $request->gender;
$patient->next_of_kin = $request->next_of_kin;
$patient->next_of_kin_relationship = $request->next_of_kin_relationship;
$patient->phone_of_next_of_kin = removeSpaces($request->next_of_kin_phone);
$patient->phone = removeSpaces($request->phone);
$patient->alternative_phone = removeSpaces($request->alternative_phone);
$patient->national_id = $request->national_id;
$patient->phone_owner = $request->phone_owner;
$patient->hospital_contact = $request->hospital_contact;
$patient->language = $request->language;
$patient->lc_one = $request->lc_one;
$patient->is_test_patient = $request->is_test_patient ?? 0;
if($request->fingerprint_template) {
$patient->fingerprint_template = $request->fingerprint_template;
}
$patient->updated_by = Auth::user()->id;
/* ===== check if it was previously a main_dependant and patient category has changed then handle */
$main_patient_to_dependants = null;
$does_previous_patient_category_have_threshold = does_patient_category_have_threshold($patient->category_id);
$does_new_patient_category_have_threshold = does_patient_category_have_threshold($request->patient_category);
$patient_is_a_dependant_of = patient_is_a_dependant_of($patient->id);
if($does_previous_patient_category_have_threshold == true || !is_null($patient_is_a_dependant_of)){
//the patient is on a patient dependants category if we go inside this "if" statement
if ($patient_is_a_dependant_of == $patient->id) {
//the patient is a main patient for dependants when we enter this "if" statement
$main_patient_to_dependants=\Streamline\Models\CategoryPatientDependant::where('main_patient_id',$patient->id)->first();
}
}
/* ======== end of patient dependants hullabaloo =========== */
if ($patient->update()) {
if ($main_patient_to_dependants && $does_new_patient_category_have_threshold == false) {
//what happens to their existing invoices though ??
$main_patient_to_dependants->delete();
}
if ($main_patient_to_dependants && $does_new_patient_category_have_threshold == true) {
$main_patient_to_dependants->patient_category_id = $request->patient_category;
$main_patient_to_dependants->update();
}
flash("Patient " . $request->first_name . " " . $request->last_name . " has been updated")->success();
return redirect('patients/'.$patient->id);
return redirect()->back()->withInput();
} else {
flash("There was an error")->error();
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id) {
$patient = Patient::find($id);
// $patient->deleted_by = auth()->user()->id;
// $patient->update();
if ($patient->delete()):
flash("Patient has been deleted.")->success();
return redirect('patients/');
endif;
}
/**
* Search/select a resource in storage.
*
*/
public function select(Request $request) {
$patient_number = $request->number;
$first_name = $request->first_name;
$last_name = $request->last_name;
$national_id = $request->national_id;
$phone_number = $request->phone_number;
$subcounty = $request->subcounty_id;
$parish = $request->parish;
$village = $request->village;
$insurance_group = $request->insurance_group;
$patient_category = $request->patient_category;
$filters = array();
$subcounty_ids = array();
$parish_ids = array();
$village_ids = array();
$insurance_group_ids = array();
$patient_category_ids = array();
$patients = array();
$criteria = '';
$searched = false;
if (!empty($request->date_of_birth)) {
$searched = TRUE;
$birth_day = Carbon::createFromFormat('d/m/Y', $request->date_of_birth)->format('Y-m-d');
if (!empty($birth_day)) {
array_push($filters, ['date_of_birth', '=', $birth_day]);
$criteria .= 'Born (' . $request->date_of_birth . ') ';
}
}
if (!empty($patient_number)) {
$searched = TRUE;
array_push($filters, ['number', 'LIKE', '%' . $patient_number . '%']);
$criteria .= 'Number (' . $patient_number . ') ';
}
if (!empty($first_name)) {
$searched = TRUE;
array_push($filters, ['first_name', 'LIKE', '%' . $first_name . '%']);
$criteria .= 'First name (' . $first_name . ') ';
}
if (!empty($last_name)) {
$searched = TRUE;
array_push($filters, ['last_name', 'LIKE', '%' . $last_name . '%']);
$criteria .= 'Last name (' . $last_name . ') ';
}
if (!empty($national_id)) {
$searched = TRUE;
array_push($filters, ['national_id', 'LIKE', '%' . $national_id . '%']);
$criteria .= 'National ID (' . $national_id . ') ';
}
if (!empty($phone_number)) {
$searched = TRUE;
array_push($filters, ['phone', 'LIKE', '%' . $phone_number . '%']);
$criteria .= 'Phone Number (' . $phone_number . ') ';
}
if (!empty($subcounty)) {
$searched = TRUE;
$subcounty_ids = DB::table('subcounties')->where('name', 'LIKE', '%' . $subcounty . '%')->pluck('id');
$criteria .= 'Subcounty (' . $subcounty . ') ';
}
if (!empty($parish)) {
$searched = TRUE;
$parish_ids = DB::table('parishes')->where('name', 'LIKE', '%' . $parish . '%')->pluck('id');
$criteria .= 'Parish (' . $parish . ') ';
}
if (!empty($village)) {
$searched = TRUE;
$village_ids = DB::table('villages')->where('name', 'LIKE', '%' . $village . '%')->pluck('id');
$criteria .= 'Village (' . $village . ') ';
}
if (!empty($insurance_group)) {
$searched = TRUE;
$insurance_group_ids = DB::table('insurance_groups')->where('name', 'LIKE', '%' . $insurance_group . '%')->pluck('id');
$criteria .= 'Insurance group (' . $insurance_group . ') ';
}
if (!empty($patient_category)) {
$searched = TRUE;
$patient_category_ids = DB::table('patient_categories')->where('name', 'LIKE', '%' . $patient_category . '%')->pluck('id');
$criteria .= 'Category (' . $patient_category . ') ';
}
if (!empty($filters)) {
$searched = TRUE;
if (!empty($subcounty_ids) || !empty($parish_ids) || !empty($village_ids) || !empty($insurance_group_ids) || !empty($patient_category_ids)) {
$patients = Patient::orderBy('first_name', 'asc')
->where($filters)
->whereIn('subcounty_id', $subcounty_ids)
->orWhereIn('parish_id', $parish_ids)
->orWhereIn('village_id', $village_ids)
->orWhereIn('insurance_group', $insurance_group_ids)
->orWhereIn('category_id', $patient_category_ids)
->paginate(200);
} else {
$patients = Patient::orderBy('first_name', 'asc')->where($filters)->paginate(200);
}
} elseif (!empty($subcounty_ids) || !empty($parish_ids) || !empty($village_ids) || !empty($insurance_group_ids) || !empty($patient_category_ids)) {
$patients = Patient::orderBy('first_name', 'asc')
->whereIn('subcounty_id', $subcounty_ids)
->orWhereIn('parish_id', $parish_ids)
->orWhereIn('village_id', $village_ids)
->orWhereIn('insurance_group', $insurance_group_ids)
->orWhereIn('category_id', $patient_category_ids)
->paginate(200);
}
$categories = DB::table('patient_categories')
->pluck("name", "id");
$marital_statuses = DB::table('marital_statuses')
->pluck("name", "id");
$occupations = DB::table('occupations')
->pluck('name', 'id');
$patient_numbers = DB::table('patients')
->orderBy('number')
->distinct()
->pluck('number');
$first_names = DB::table('patients')
->orderBy('first_name')
->distinct()
->pluck('first_name');
$last_names = DB::table('patients')
->orderBy('last_name')
->distinct()
->pluck('last_name');
$national_ids = DB::table('patients')
->orderBy('national_id')
->distinct()
->pluck('national_id');
$insurance_groups = DB::table('insurance_groups')
->orderBy('name')
->distinct()
->pluck('name');
$patient_categories = DB::table('patient_categories')
->orderBy('name')
->distinct()
->pluck('name');
$subcounties = DB::table('subcounties')
->orderBy('name')
->distinct()
->pluck('name');
$parishes = DB::table('parishes')
->orderBy('name')
->distinct()
->pluck('name');
$villages = DB::table('villages')
->orderBy('name')
->distinct()
->pluck('name');
if (count($patients) || $searched == TRUE) {
$categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id")->toArray();
$marital_statuses = DB::table('marital_statuses')->pluck("name", "id")->toArray();
$occupations = DB::table('occupations')->pluck('name', 'id')->toArray();
return view('patients::patients.selected', ['patient_count' => count($patients), 'criteria' => $criteria], compact('patients', 'categories', 'marital_statuses', 'occupations'));
} else {
return view('patients::patients.select', compact('subcounty_ids', 'categories', 'marital_statuses', 'occupations', 'patient_numbers', 'first_names', 'last_names', 'national_ids', 'insurance_groups', 'patient_categories', 'subcounties', 'parishes', 'villages'));
}
}
public function get_counties($id) {
$code = "<option> -- select -- </option>";
$counties = DB::table('counties')
->whereNull('deleted_at')
->where(['district_id' => $id])
->get();
foreach ($counties as $county) {
$code .= "<option value='" . $county->id . "'>" . $county->name . "</option>";
}
return $code;
}
public function get_subcounties($id) {
$code = "<option> -- select -- </option>";
$subcounties = DB::table('subcounties')
->whereNull('deleted_at')
->where(['county_id' => $id])
->get();
foreach ($subcounties as $subcounty) {
$code .= "<option value='" . $subcounty->id . "'>" . $subcounty->name . "</option>";
}
$code .= "</select>";
return $code;
}
public function get_parishes($id) {
$code = "<option> -- select -- </option>";
$parishes = DB::table('parishes')
->whereNull('deleted_at')
->where(['subcounty_id' => $id])
->get();
foreach ($parishes as $parish) {
$code .= "<option value='" . $parish->id . "'>" . $parish->name . "</option>";
}
return $code;
}
public function get_villages($id) {
$code = "<option> -- select -- </option>";
$villages = DB::table('villages')
->whereNull('deleted_at')
->where(['parish_id' => $id])
->get();
foreach ($villages as $village) {
$code .= "<option value='" . $village->id . "'>" . $village->name . "</option>";
}
return $code;
}
/**
* Display a listing of the inactive resource(s).
*
* @return \Illuminate\Http\Response
*/
public function inactive() {
$patientCount = Patient::get() ->count();
$patients = Patient::onlyTrashed()->orderBy('id', 'desc')->paginate(20);
$categories = PatientCategory::pluck("name", "id");
$marital_statuses = MaritalStatus::pluck("name", "id");
if (is_null($patients)) {
flash()->error("There is no inactive patient");
return redirect('/patients/');
} else {
return view('patients::patients.inactive', ['PatientCount' => $patientCount], compact('patients', 'categories', "marital_statuses"));
}
}
/**
* Activate the specified resource in storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function activate($id) {
//dd('inn here');
$patients = Patient::withTrashed()->where('id',$id)->get();
if (!is_null($patients)) {
$patient = $patients->first();
if ($patient->restore()):
flash("Patient has been activated.")->success();
return redirect('/patients/inactive');
endif;
}
}
/*
* get patient residences and send corresponding drop down options
*/
public function get_residence($district_id) {
//loop is going to take long execution time
$villages_array = [];
$parishes_array = [];
$subcounties_array = [];
$counties = DB::table('counties')->where(['district_id' => $district_id])->whereNull('deleted_at')->pluck("name", "id");
foreach ($counties as $county_id => $county_name) {
$subcounties = DB::table('subcounties')->where(['county_id' => $county_id])->whereNull('deleted_at')->get();
foreach ($subcounties as $subcounty) {
$subcounties_array[$subcounty->id] = $subcounty->name;
$parishes = DB::table('parishes')->where(['subcounty_id' => $subcounty->id])->whereNull('deleted_at')->get();
foreach ($parishes as $parish) {
$parishes_array[$parish->id] = $parish->name;
$villages = DB::table('villages')->where(['parish_id' => $parish->id])->whereNull('deleted_at')->get();
foreach ($villages as $village) {
$villages_array[$village->id] = $village->name;
}
}
}
}
return ['subcounties' => $subcounties_array, 'parishes' => $parishes_array, 'villages' => $villages_array];
}
public function get_residence_district($district_id) {
//loop is going to take long execution time
$villages_array = [];
$parishes_array = [];
$sub_counties_array = [];
$counties_array = [];
$residences_array = [];
$counties = DB::table('counties')->where(['district_id' => $district_id])->whereNull('deleted_at')->orderBy("name","asc")->pluck("name", "id");
foreach ($counties as $county_id => $county_name) {
$counties_array[$county_id] = $county_name;
$subcounties = DB::table('subcounties')->where(['county_id' => $county_id])->whereNull('deleted_at')->get();
foreach ($subcounties as $subcounty) {
$sub_counties_array[$subcounty->id] = $subcounty->name;
$parishes = DB::table('parishes')->where(['subcounty_id' => $subcounty->id])->whereNull('deleted_at')->get();
foreach ($parishes as $parish) {
$parishes_array[$parish->id] = $parish->name;
$villages = DB::table('villages')->where(['parish_id' => $parish->id])->whereNull('deleted_at')->get();
foreach ($villages as $village) {
$villages_array[$village->id] = $village->name;
}
}
}
}
$residences_array['counties'] = $counties_array;
$residences_array['subcounties'] = $sub_counties_array;
$residences_array['parishes'] = $parishes_array;
$residences_array['villages'] = $villages_array;
return json_encode($residences_array);
}
public function get_residence_county($county_id) {
//loop is going to take long execution time
$villages_array = [];
$parishes_array = [];
$sub_counties_array = [];
$residences_array = [];
$subcounties = DB::table('subcounties')->where(['county_id' => $county_id])->whereNull('deleted_at')->orderBy("name","asc")->get();
foreach ($subcounties as $subcounty) {
$sub_counties_array[$subcounty->id] = $subcounty->name;
$parishes = DB::table('parishes')->where(['subcounty_id' => $subcounty->id])->whereNull('deleted_at')->get();
foreach ($parishes as $parish) {
$parishes_array[$parish->id] = $parish->name;
$villages = DB::table('villages')->where(['parish_id' => $parish->id])->whereNull('deleted_at')->get();
foreach ($villages as $village) {
$villages_array[$village->id] = $village->name;
}
}
}
$residences_array['subcounties'] = $sub_counties_array;
$residences_array['parishes'] = $parishes_array;
$residences_array['villages'] = $villages_array;
return json_encode($residences_array);
}
public function get_residence_sub_county($sub_county_id) {
//loop is going to take long execution time
$villages_array = [];
$parishes_array = [];
$residences_array = [];
$parishes = DB::table('parishes')->where(['subcounty_id' => $sub_county_id])->whereNull('deleted_at')->orderBy("name","asc")->get();
foreach ($parishes as $parish) {
$parishes_array[$parish->id] = $parish->name;
$villages = DB::table('villages')->where(['parish_id' => $parish->id])->whereNull('deleted_at')->get();
foreach ($villages as $village) {
$villages_array[$village->id] = $village->name;
}
}
$residences_array['parishes'] = $parishes_array;
$residences_array['villages'] = $villages_array;
return json_encode($residences_array);
}
public function get_residence_parish($parish_id) {
//loop is going to take long execution time
$villages_array = [];
$residences_array = [];
$villages = DB::table('villages')->where(['parish_id' => $parish_id])->whereNull('deleted_at')->orderBy("name","asc")->get();
foreach ($villages as $village) {
$villages_array[$village->id] = $village->name;
}
$residences_array['villages'] = $villages_array;
return json_encode($residences_array);
}
/* cater for adding a new occupation from a modal dynamically */
public function add_new_occupation_dynamically(Request $request)
{
$occupation = new Occupation;
$occupation->name = $request->name;
$occupation->created_by = Auth::user()->id;
$occupation->updated_by = Auth::user()->id;
try {
$occupation->save();
return $occupation->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
flash($request->name . " Occupation already exists!")->error();
return back()->withInput();
}
}
}
public function add_new_district_dynamically(Request $request)
{
$district = new District;
$district->name = $request->name;
$district->created_by = Auth::user()->id;
$district->updated_by = Auth::user()->id;
$check = District::where('name', $request->name)->pluck('name')->first();
if(is_null($check)){
try {
$district->save();
return $district->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
flash($request->name . " District already exists!")->error();
return back()->withInput();
}
}
}else{
return 'false';
}
}
public function add_new_county_dynamically(Request $request)
{
$county = new County;
$county->name = $request->name;
$county->district_id = $request->district_id;
$county->created_by = Auth::user()->id;
$county->updated_by = Auth::user()->id;
$check = County::where('name', $request->name)->pluck('name')->first();
if(is_null($check)){
try {
$county->save();
return $county->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
flash($request->name . " Occupation already exists!")->error();
return back()->withInput();
}
}
}else{
return 'false';
}
}
public function add_new_subcounty_dynamically(Request $request)
{
$sub_county = new Subcounty;
$sub_county->name = $request->name;
$sub_county->county_id = $request->county_id;
$sub_county->created_by = Auth::user()->id;
$sub_county->updated_by = Auth::user()->id;
$check = Subcounty::where('name', $request->name)->pluck('name')->first();
if(is_null($check)){
try {
$sub_county->save();
return $sub_county->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
flash($request->name . " Occupation already exists!")->error();
return back()->withInput();
}
}
}else{
return 'false';
}
}
public function add_new_parish_dynamically(Request $request)
{
$parish = new Parish;
$parish->name = $request->name;
$parish->subcounty_id = $request->subcounty_id;
$parish->created_by = Auth::user()->id;
$parish->updated_by = Auth::user()->id;
$check = Parish::where('name', $request->name)->pluck('name')->first();
if(is_null($check)){
try {
$parish->save();
return $parish->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
flash($request->name . " Occupation already exists!")->error();
return back()->withInput();
}
}
}else{
return 'false';
}
}
public function add_new_village_dynamically(Request $request)
{
$village = new Village;
$village->name = $request->name;
$village->parish_id = $request->parish_id;
$village->created_by = Auth::user()->id;
$village->updated_by = Auth::user()->id;
$check = Village::where('name', $request->name)->pluck('name')->first();
if(is_null($check)){
try {
$village->save();
return $village->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
flash($request->name . " Occupation already exists!")->error();
return back()->withInput();
}
}
}else{
return 'false';
}
}
public function follow_up(){
$follow_ups = PatientAppointment::where('is_confirmed', 1)->get();
$calender_dates = [];
$count = 0;
foreach ($follow_ups as $follow_up){
$patient_name = get_full_name($follow_up->patient_id, 'id', 'first_name', 'last_name', 'patients');
$calender_dates[$count] = ["title" => $patient_name, "start" => $follow_up->appointment_date . "T" . $follow_up->appointment_time];
$count++;
}
$clinics = Clinic::orderBy('name')->pluck("name", "id")->toArray();
$clinics = ['0' => 'All Clinics'] + $clinics;
$users = User::orderBy('first_name')->select("id", "first_name", "last_name")->get();
$users_array = [];
$users_collection = DB::table('users')->orderBy("first_name","asc")->select("id")->get()->toArray();
foreach ($users_collection as $value){
$user = User::find($value->id);
if (!is_null($user)) {
if ($user->hasRole('Doctors') || $user->hasRole('Doctor')) {
//use this join query instead of the commented out query to cater for execution speed (N+1)
$consultation_records = DB::table('services')
->join('staff_payment_configurations','staff_payment_configurations.item_id', '=', 'services.id')
->where('services.item_type', 'Consultation')
->where('staff_payment_configurations.user_id',$value->id)
->where('staff_payment_configurations.item_category',3)
->orderBy('staff_payment_configurations.created_at','asc')
->select('services.*')
->get();
foreach ($consultation_records as $record) {
$users_consultation_fee = $record->non_insured_price;
//concatnate the service_record_id with the users id to form the key for the array
$users_array[$record->id."__".$value->id] = get_full_name($value->id, 'id', 'first_name', 'last_name', 'users')." (Consultation Fee: ".ugandan_shillings($users_consultation_fee).")";
}
}
}
}
$users_array = ['' => '- select -'] + $users_array;
$special_clinics = DB::table('clinics')->where('available', 1)->whereNull('deleted_at')->pluck("name", "id")->prepend('- select -', '');
return view('patients::patients.follow_up', compact('calender_dates', 'clinics', 'users', 'users_array', 'special_clinics'));
}
public function follow_up_fetch_patients(Request $request){
$selected_date = $request->selected_date;
if ($request->user_id != 0){
$follow_ups = PatientAppointment::where(['appointment_date' => $selected_date])->where(['incharge_id' => $request->user_id])->get();
} else {
$follow_ups = PatientAppointment::where(['appointment_date' => $selected_date])->get();
}
$code = "";
if ($follow_ups->count() > 0){
foreach ($follow_ups as $follow_up){
if ($request->clinic_id != -1){
if ($follow_up->clinic_allocation != $request->clinic_id){
// skip current loop
continue;
}
}
$code .= "<tr>";
$code .= "<td>";
$code .= get_full_name($follow_up->patient_id, 'id', 'first_name', 'last_name', 'patients') . " (" . get_name($follow_up->patient_id, 'id', 'number', 'patients') . ")";
$code .= "</td>";
$code .= "<td>";
$code .= ($follow_up->clinic_allocation == 0) ? "No clinic specified" : get_name($follow_up->clinic_allocation, 'id', 'name', 'clinics');
$code .= "</td>";
$code .= "<td>";
$code .= ($follow_up->incharge_id == 0) ? "No incharge specified" : get_full_name($follow_up->incharge_id, 'id', 'first_name', 'last_name', 'users');
$code .= "</td>";
$code .= "<td>";
$code .= $follow_up->appointment_time;
$code .= "</td>";
$code .= "<td>";
$code .= "Phone Number: " . get_name($follow_up->patient_id, 'id', 'phone', 'patients') . " Email: " . get_name($follow_up->patient_id, 'id', 'email', 'patients');
$code .= "</td>";
$code .= "<td>";
$code .= is_null($follow_up->comments) ? 'N/A' : $follow_up->comments;
$code .= "</td>";
$code .= "<td>";
if ($follow_up->appointment_fulfilled == 1){
$code .= "<label class='label label-success'>Appointment Completed</label>";
} else if ($follow_up->appointment_fulfilled == 2){
$code .= "<label class='label label-danger'>Appointment Cancelled</label>";
} else {
$code .= "<a class='btn btn-success btn-rounded' onclick='displayAppointmentActions(" . $follow_up->patient_id . "," . $follow_up->id . ")'>Actions</a>";
}
$code .= "</td>";
$code .= "</tr>";
}
} else {
$code .= "<tr><td colspan='8'><h4 class='text-center'>No patient appointments available for this date</h4></td></tr>";
}
// check if the code is empty for when clinics selected are not available
if ($code == ''){
$code .= "<tr><td colspan='8'><h4 class='text-center'>No patient appointments available for this date</h4></td></tr>";
}
return $code;
}
public function create_appointment(){
$clinics = Clinic::orderBy('name')->pluck("name", "id")->toArray();
$clinics = ['0' => "Don't assign clinic"] + $clinics;
$users = User::orderBy('first_name')->select("id", "first_name", "last_name")->get();
return view('patients::patients.create_appointment', compact('clinics', 'users'));
}
public function save_appointment(Request $request){
$appointment = new PatientAppointment();
if (is_null($request->in_charge)){
$in_charge = 0;
} else {
$in_charge = $request->in_charge;
}
if (is_null($request->clinic_allocation)){
$clinic_allocation = 0;
} else {
$clinic_allocation = $request->clinic_allocation;
}
$appointment->patient_id = $request->patient_id;
$appointment->incharge_id = $in_charge;
$appointment->clinic_allocation = $clinic_allocation;
$appointment->episode_id = 0;
$appointment->appointment_date = Carbon::parse($request->appointment_date)->format('Y-m-d');
$appointment->appointment_time = $request->appointment_time;
$appointment->comments = $request->comments;
$appointment->created_from = "Patient Appointments";
$appointment->created_by = Auth::user()->id;
$appointment->updated_by = Auth::user()->id;
if ($appointment->save()){
flash("Patient appointment has been saved")->success();
return redirect("/patients/follow_up");
} else {
flash("An error occurred!")->error();
return back()->withInput();
}
}
public function complete_appointment($id) {
$appointment = PatientAppointment::find($id);
$patient_id = $appointment->patient_id;
// reassign the appointment_fulfilled to 1
$appointment->appointment_fulfilled = 1;
$appointment->updated_by = Auth::user()->id;
if ($appointment->save()){
/*==== create a new episode but attached to the original episode as appointment is started/activated ========*/
$episode = new PatientEpisode;
$episode->patient_id = $appointment->patient_id;
$episode->parent_episode_id = $appointment->episode_id == 0 ? null : $appointment->episode_id;//the original episode_id
$episode->created_by = auth()->user()->id;
$episode->updated_by = auth()->user()->id;
//put this patient_id into session
session()->put('patient_id', $patient_id);
try {
$episode->save();
flash("A new episode has been saved")->success();
//if the parent episode was an ANC visit then create a copy of previous anc registration and attach it to this episode
$previous_anc_visit = \Streamline\Models\AnteNatalClinicFollowup::where(['patient_id' => $episode->patient_id, 'episode_id' => $episode->parent_episode_id])->first();
if ($previous_anc_visit) {
create_anc_registration_record_from_previous_visit($patient_id, $episode->parent_episode_id, $episode->id);
//allocate to ANC clinic straight away
$anc_clinic_id = get_name('ante_natal', 'slug', 'id', 'clinics');
$episode->clinic_id = $anc_clinic_id;
$episode->update();
}
// check where the function was called from and return there
if (isset($request->is_from_finance)) {
// return to finance home
return redirect('/patient_finance/home');
} else {
// return to normal patient home
return redirect('/patient_episodes/');
}
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
flash("This episode already exists!")->error();
return back()->withInput();
}
}
/*================= end of creation of new episode on starting an appointment =================*/
flash("Patient follow up completed successfully")->success();
return redirect('/patient_episodes/set_patient_id/' . $patient_id);
} else {
flash("An error occurred!")->error();
return back()->withInput();
}
}
public function cancel_patient_appointment($id) {
$appointment = PatientAppointment::find($id);
// reassign the appointment_fulfilled to 2, indicating cancelled
$appointment->appointment_fulfilled = 2;
$appointment->updated_by = Auth::user()->id;
if ($appointment->save()){
return 1;
} else {
return 0;
}
}
public function reschedule_appointment($id) {
$appointment = PatientAppointment::find($id);
$clinics = Clinic::orderBy('name')->pluck("name", "id")->toArray();
$clinics = ['0' => "Don't assign clinic"] + $clinics;
$users = User::orderBy('first_name')->select("id", "first_name", "last_name")->get();
return view('patients::patients.reschedule_appointment', compact('appointment', 'clinics', 'users'));
}
public function save_rescheduled_appointment(Request $request){
$appointment = PatientAppointment::find($request->appointment_id);
if (is_null($request->in_charge)){
$in_charge = 0;
} else {
$in_charge = $request->in_charge;
}
if (is_null($request->clinic_allocation)){
$clinic_allocation = 0;
} else {
$clinic_allocation = $request->clinic_allocation;
}
$appointment->incharge_id = $in_charge;
$appointment->clinic_allocation = $clinic_allocation;
$appointment->appointment_date = Carbon::parse($request->appointment_date)->format('Y-m-d');
$appointment->appointment_time = $request->appointment_time;
$appointment->comments = $request->comments;
$appointment->updated_by = Auth::user()->id;
if ($appointment->save()){
flash("Patient appointment has been rescheduled successfully")->success();
return redirect("/patients/follow_up");
} else {
flash("An error occurred!")->error();
return back()->withInput();
}
}
public function appointment_requests() {
$appointments = PatientAppointment::where('is_confirmed', 0)
->whereNotIn('appointment_fulfilled', [2])
->where('appointment_date', '>', date('Y-m-d'))
->get();
return view('patients::patients.appointment_requests', compact('appointments'));
}
public function confirm_appointment($id) {
$appointment = PatientAppointment::find($id);
$clinics = Clinic::orderBy('name')->pluck("name", "id")->toArray();
$clinics = ['0' => "Don't assign clinic"] + $clinics;
$users = User::orderBy('first_name')->select("id", "first_name", "last_name")->get();
return view('patients::patients.confirm_appointment', compact('appointment', 'clinics', 'users'));
}
public function save_confirmed_appointment(Request $request) {
$appointment = PatientAppointment::find($request->appointment_id);
if (is_null($request->in_charge)){
$in_charge = 0;
} else {
$in_charge = $request->in_charge;
}
if (is_null($request->clinic_allocation)){
$clinic_allocation = 0;
} else {
$clinic_allocation = $request->clinic_allocation;
}
$appointment->incharge_id = $in_charge;
$appointment->clinic_allocation = $clinic_allocation;
$appointment->appointment_date = Carbon::parse($request->appointment_date)->format('Y-m-d');
$appointment->appointment_time = $request->appointment_time;
$appointment->comments = $request->comments;
$appointment->is_confirmed = 1;
$appointment->updated_by = auth()->id();
if ($appointment->save()){
if (is_sms_enabled()) {
// send sms alert to the patient
$sms = "Your appointment at " . get_name(1, 'id', 'name', 'hospital_information') .
" has been confirmed for the " . streamline_date($appointment->appointment_date) . " at " . $appointment->appointment_time;
(new SMSController)->send_appointments_alert($appointment->patient_id, $sms);
}
flash("Patient appointment has been confirmed")->success();
return redirect("/patients/appointment_requests");
} else {
flash("An error occurred!")->error();
return back()->withInput();
}
}
public function update_patient_info($id) {
$patient = Patient::find($id);
if ($patient) {
$first_name = title_case($patient->first_name);
$last_name = title_case($patient->last_name);
$code = '<p><b>Patient Names:</b> ' . $first_name . ' ' . $last_name . '</p>';
$code .= '<p><b>Patient Number:</b> ' . $patient->number . '</p>';
$code .= '<p><b>Gender:</b> ' . ($patient->gender == 1 ? "Male" : "Female"). ' &nbsp;&nbsp;&nbsp;<b>Date of Birth:</b> ' . streamline_date($patient->date_of_birth) . '</p>';
$code .= '<p><b>Phone Number:</b> ' . $patient->phone . ' &nbsp;&nbsp;&nbsp;<b>Next of Kin:</b> ' . $patient->next_of_kin . ' ('.$patient->phone_of_next_of_kin. ')</p>';
$code .= '<p><b>Patient Category:</b> ' . get_name($patient->category_id, 'id', 'name', 'patient_categories') . '</p>';
$code .= '<p><b>Village:</b> ' . get_name($patient->village_id, 'id', 'name', 'villages') . '</p>';
} else {
$code = '<h3 style="color: red"><b>Patient Not Found</b></h3>';
}
return $code;
}
public function search_residences(Request $request) {
$data = [];
$counter = 0;
if ($request->has('q')) {
$search = $request->q;
$districts = DB::table('districts')->whereNull('deleted_at')->where('name', 'LIKE', "%$search%")->get();
$counties = DB::table('counties')->whereNull('deleted_at')->where('name', 'LIKE', "%$search%")->get();
$subcounties = DB::table('subcounties')->whereNull('deleted_at')->where('name', 'LIKE', "%$search%")->get();
$parish = DB::table('parishes')->whereNull('deleted_at')->where('name', 'LIKE', "%$search%")->get();
$village = DB::table('villages')->whereNull('deleted_at')->where('name', 'LIKE', "%$search%")->get();
$districts_arr = DB::table('districts')->whereNull('deleted_at')->pluck('name', 'id')->toArray();
$counties_arr = DB::table('counties')->whereNull('deleted_at')->pluck('name', 'id')->toArray();
$subcounties_arr = DB::table('subcounties')->whereNull('deleted_at')->pluck('name', 'id')->toArray();
$parish_arr = DB::table('parishes')->whereNull('deleted_at')->pluck('name', 'id')->toArray();
$counties_rel_arr = DB::table('counties')->whereNull('deleted_at')->pluck('district_id', 'id')->toArray();
$subcounties_rel_arr = DB::table('subcounties')->whereNull('deleted_at')->pluck('county_id', 'id')->toArray();
$parish_rel_arr = DB::table('parishes')->whereNull('deleted_at')->pluck('subcounty_id', 'id')->toArray();
if (count($village) > 0) {
// village with name found
foreach ($village as $value) {
$parish_id = $value->parish_id;
$parish_name = $parish_arr[$parish_id] ?? '';
$subcounty_id = $parish_rel_arr[$parish_id] ?? 0;
$subcounty_name = $subcounties_arr[$subcounty_id] ?? '';
$county_id = $subcounties_rel_arr[$subcounty_id] ?? 0;
$county_name = $counties_arr[$county_id] ?? '';
$district_id = $counties_rel_arr[$county_id] ?? 0;
$district_name = $districts_arr[$district_id] ?? '';
$data[$counter]['ids'] = $value->id . "," . $parish_id . "," . $subcounty_id . "," . $county_id . "," . $district_id;
$data[$counter]['text'] = "Village: " . $value->name . " Parish: " . $parish_name . " Subcounty: " . $subcounty_name . " County: " . $county_name . " District: " . $district_name;
$counter++;
}
}
if (count($parish) > 0) {
// parish with name found
foreach ($parish as $value) {
$parish_name = $parish_arr[$value->id] ?? '';
$subcounty_id = $parish_rel_arr[$value->id] ?? 0;
$subcounty_name = $subcounties_arr[$subcounty_id] ?? '';
$county_id = $subcounties_rel_arr[$subcounty_id] ?? 0;
$county_name = $counties_arr[$county_id] ?? '';
$district_id = $counties_rel_arr[$county_id] ?? 0;
$district_name = $districts_arr[$district_id] ?? '';
$data[$counter]['ids'] = 0 . "," . $value->id . "," . $subcounty_id . "," . $county_id . "," . $district_id;
$data[$counter]['text'] = "Parish: " . $parish_name . " Subcounty: " . $subcounty_name . " County: " . $county_name . " District: " . $district_name;
$counter++;
}
}
if (count($subcounties) > 0) {
// subcounties with name found
foreach ($subcounties as $value) {
$subcounty_name = $subcounties_arr[$value->id] ?? '';
$county_id = $subcounties_rel_arr[$value->id] ?? 0;
$county_name = $counties_arr[$county_id] ?? '';
$district_id = $counties_rel_arr[$county_id] ?? 0;
$district_name = $districts_arr[$district_id] ?? '';
$data[$counter]['ids'] = 0 . "," . 0 . "," . $value->id . "," . $county_id . "," . $district_id;
$data[$counter]['text'] = "Subcounty: " . $subcounty_name . " County: " . $county_name . " District: " . $district_name;
$counter++;
}
}
if (count($counties) > 0) {
// counties with name found
foreach ($counties as $value) {
$county_name = $counties_arr[$value->id] ?? '';
$district_id = $counties_rel_arr[$value->id] ?? 0;
$district_name = $districts_arr[$district_id] ?? '';
$data[$counter]['ids'] = 0 . "," . 0 . "," . 0 . "," . $value->id . "," . $district_id;
$data[$counter]['text'] = "County: " . $county_name . " District: " . $district_name;
$counter++;
}
}
if (count($districts) > 0) {
// districts with name found
foreach ($districts as $value) {
// auto generate the rest of the variables
$district_name = $districts_arr[$value->id] ?? '';
$data[$counter]['ids'] = 0 . "," . 0 . "," . 0 . "," . 0 . "," . $value->id;
$data[$counter]['text'] = "District: " . $district_name;
$counter++;
}
}
}
return response()->json($data);
}
public function add_company(Request $request)
{
$company = new Company;
$company->name = $request->company_name;
$company->contact = $request->company_contact;
$company->slug = $request->company_identifier;
$company->created_by = auth()->user()->id;
try {
$company->save();
return $company->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
return response()->json(['error' => $e]);
}
}
}
public function quick_add_district_residence(Request $request)
{
$district = new District;
$district->name = $request->new_residence_district_name;
$district->created_by = auth()->user()->id;
try {
$district->save();
return $district->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
return response()->json(['error' => $e]);
}
}
}
public function quick_add_village_residence(Request $request)
{
$district_id = $request->residence_district_name;
$village = new Village;
$village->name = $request->new_residence_village_name;
$village->parish_id = 0; //$request->parish_id;
$village->created_by = auth()->user()->id;
try {
$village->save();
return $village->id;
} catch (QueryException $e) {
$errorCode = $e->errorInfo[1];
if ($errorCode == 1062) { //error code for duplicate entry to a unique field
return response()->json(['error' => $e]);
}
}
}
public function check_duplicate_patients(Request $request) {
$result_count = 0;
$html_text = 0;
$patients = [];
if (isset($request->first_name) && isset($request->last_name)) {
$patients_one = DB::table('patients')
->where('first_name', 'LIKE', "%$request->first_name%")
->where('last_name', 'LIKE', "%$request->last_name%")
->get(["id", "first_name", "last_name", "number", "gender", "date_of_birth", "phone", "category_id"]);
$patients_two = DB::table('patients')
->where('first_name', 'LIKE', "%$request->last_name%")
->where('last_name', 'LIKE', "%$request->first_name%")
->get(["id", "first_name", "last_name", "number", "gender", "date_of_birth", "phone", "category_id"]);
$patients = $patients_one->merge($patients_two);
$result_count += count($patients);
}
if (isset($request->phone)) {
$patients_phone = DB::table('patients')
->where('phone', removeSpaces($request->phone))
->get(["id", "first_name", "last_name", "number", "gender", "date_of_birth", "phone", "category_id"]);
if (count($patients) > 0) {
$patients = $patients->merge($patients_phone);
} else {
$patients = $patients_phone;
}
$result_count += count($patients_phone);
}
if ($result_count > 0) {
$html_text = "<table class='table table-bordered table-striped'>";
$html_text .= "<tr>";
$html_text .= "<th style='color: black' class='text-center'> Name </th>";
$html_text .= "<th style='color: black' class='text-center'> Gender </th>";
$html_text .= "<th style='color: black' class='text-center'> Age </th>";
$html_text .= "<th style='color: black' class='text-center'> Phone </th>";
$html_text .= "<th style='color: black' class='text-center'> Patient Category </th>";
$html_text .= "<th></th>";
$html_text .= "</tr>";
$categories = PatientCategory::pluck("name", "id");
foreach ($patients as $patient) {
$html_text .= "<tr>";
$html_text .= "<td>" . $patient->first_name . " " . $patient->last_name . " (" . $patient->number . ")" . "</td>";
$html_text .= "<td>" . (($patient->gender == 1) ? "Male" : "Female") . "</td>";
$html_text .= "<td>" . get_patients_age($patient->date_of_birth) . "</td>";
$html_text .= "<td>" . $patient->phone . "</td>";
$html_text .= "<td>" . (isset($categories[$patient->category_id]) ? $categories[$patient->category_id] : "N/A") . "</td>";
$html_text .= "<td><a href='/patient_episodes/set_patient_id/" . $patient->id . "' class='btn btn-rounded btn-primary btn-sm'><i class='fa fa-hand-pointer-o'></i> <strong>Select</strong></a></td>";
$html_text .= "</tr>";
}
$html_text .= "</table>";
}
return json_encode([
"results_count" => $result_count,
"html" => $html_text
]);
}
public function search_patient_by_name_number(Request $request) {
$data = [];
if ($request->has('q')) {
$search = $request->q;
$data = DB::table('patients')->select("id", "first_name", "last_name", "number", "phone")
->where('last_name', 'LIKE', "%$search%")
->orWhere('first_name', 'LIKE', "%$search%")
->orWhere('number', 'LIKE', "%$search%")
->get();
}
return response()->json($data);
}
public function possible_duplicate_patients($id) {
$possible_duplicate_patients = possible_patient_record_duplicates($id);
$original_patient = Patient::find($id);
$districts = DB::table('districts')->pluck('name', 'id');
$counties = DB::table('counties')->pluck('name', 'id');
$subcounties = DB::table('subcounties')->pluck('name', 'id');
$parishes = DB::table('parishes')->pluck('name', 'id');
$villages = DB::table('villages')->pluck('name', 'id');
$occupations = DB::table('occupations')->pluck('name', 'id');
$religions = DB::table('religions')->pluck('name', 'id');
$relationships = DB::table('family_relations')->pluck('name', 'id');
$last_episode = PatientEpisode::where('patient_id',$id)->orderBy('created_at', 'desc')->first();
return view('patients::patients.compare_patient_records', compact('original_patient', 'possible_duplicate_patients', 'districts', 'counties', 'subcounties', 'parishes', 'villages', 'occupations', 'religions', 'relationships', 'last_episode'));
}
public function display_original_and_duplicate_patients(Request $request)
{
$patient_id = $request->patient_id;
$patient = Patient::find($patient_id);
$html_text = "<table class='table table-bordered table-striped'>";
$html_text .= "<tr>";
$html_text .= "<td><input type='checkbox' name='all_duplicate_fields' id='all_duplicate_fields'> All values from ". get_full_name($patient->id, "id", "first_name", "last_name", "patients")."</td><input name='duplicate_id' type='hidden' value='".$patient->id."'";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='first_name' value=". $patient->first_name."> " . $patient->first_name . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='last_name' value=". $patient->last_name."> " . $patient->last_name . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$gender = $patient->gender == 1 ? "Male" : "Female";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='gender' value=". $patient->gender."> " . $gender . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='dob' value=". $patient->date_of_birth."> " . get_patients_age($patient->date_of_birth) . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='phone' value=". $patient->phone."> " . $patient->phone . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='category_id' value=". $patient->category_id."> " . get_name($patient->category_id, "id", "name", "patient_categories") . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='district_id' value=". $patient->district_id."> " . get_name($patient->district_id, "id", "name", "districts") . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='county_id' value=". $patient->county_id."> " . get_name($patient->county_id, "id", "name", "counties") . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='subcounty_id' value=". $patient->subcounty_id."> " . get_name($patient->subcounty_id, "id", "name", "subcounties") . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='parish_id' value=". $patient->parish_id."> " . get_name($patient->parish_id, "id", "name", "parishes") . "</td>";
$html_text .= "</tr>";
$html_text .= "<tr>";
$html_text .= "<td><input type='radio' class='duplicate_radio' name='village_id' value=". $patient->village_id."> " . get_name($patient->village_id, "id", "name", "villages") . "</td>";
$html_text .= "</tr>";
$html_text .= "</table>";
return json_encode([
"html" => $html_text
]);
}
public function merge_records(Request $request)
{
$patient_id_one = (int)$request->original_id;
$patient_id_two = (int)$request->duplicate_id;
//1.get the original and dupe patient ids
//2.the the original record with all selected fields to keep
//3.loop through the medical and finance tables updating the patient id.
//4.delete the duplicate
$patient_ids_array = [$patient_id_one, $patient_id_two];
$patient_id = min($patient_ids_array);
$patient_id_to_delete = max($patient_ids_array);
$patient = Patient::find($patient_id);
$patient->first_name = $request->first_name;
$patient->last_name = $request->last_name;
$patient->date_of_birth = $request->dob;
$patient->gender = $request->gender;
$patient->phone = removeSpaces($request->phone);
$patient->category_id = $request->category_id;
$patient->district_id = $request->district_id;
$patient->county_id = $request->county_id;
$patient->subcounty_id = $request->subcounty_id;
$patient->parish_id = $request->parish_id;
$patient->village_id = $request->village_id;
$patient->updated_by = Auth::user()->id;
if ($patient->update()) {
$delete_patient_record = Patient::find($patient_id_to_delete);
$delete_patient_record->delete();
//loop thru episodes
$patient_episodes = PatientEpisode::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_episodes) > 0) {
foreach ($patient_episodes as $episode) {
$episode->patient_id = $patient_id;
$episode->update();
}
}
//loop through triage
$patient_triage = \Streamline\Models\Triage::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_triage) > 0) {
foreach ($patient_triage as $triage) {
$triage->patient_id = $patient_id;
$triage->update();
}
}
//loop thru consultations
$patient_consultations = \Streamline\Models\Consultation::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_consultations) > 0) {
foreach ($patient_consultations as $consultation) {
$consultation->patient_id = $patient_id;
$consultation->update();
}
}
//loop thru treatment
$patient_treatments = \Streamline\Models\Treatment::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_treatments) > 0) {
foreach ($patient_treatments as $treatment) {
$treatment->patient_id = $patient_id;
$treatment->update();
}
}
//loop thru ordered invs
$patient_ordered_invs = \Streamline\Models\OrderedInvestigation::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_ordered_invs) > 0) {
foreach ($patient_ordered_invs as $ordered_invs) {
$ordered_invs->patient_id = $patient_id;
$ordered_invs->update();
}
}
//loop thru investigation results
$investigation_results = \Streamline\Models\InvestigationResults::where('patient_id', $patient_id_to_delete)->get();
if (count($investigation_results) > 0) {
foreach ($investigation_results as $inv_results) {
$inv_results->patient_id = $patient_id;
$inv_results->update();
}
}
//loop thru ordered procedures
$patient_ordered_procedures = \Streamline\Models\OrderedProcedure::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_ordered_procedures) > 0) {
foreach ($patient_ordered_procedures as $ordered_procedures) {
$ordered_procedures->patient_id = $patient_id;
$ordered_procedures->update();
}
}
//loop thru ordered sundries
$patient_ordered_sundries = \Streamline\Models\OrderedSundry::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_ordered_sundries) > 0) {
foreach ($patient_ordered_sundries as $ordered_sundry) {
$ordered_sundry->patient_id = $patient_id;
$ordered_sundry->update();
}
}
//loop through ordered services
$patient_ordered_services = \Streamline\Models\OrderedService::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_ordered_services) > 0) {
foreach ($patient_ordered_services as $ordered_services) {
$ordered_services->patient_id = $patient_id;
$ordered_services->update();
}
}
//loop through inpatient info
$inpatient_info_records = \Streamline\Models\InpatientInfo::where('patient_id', $patient_id_to_delete)->get();
if (count($inpatient_info_records) > 0) {
foreach ($inpatient_info_records as $inpatient_info) {
$inpatient_info->patient_id = $patient_id;
$inpatient_info->update();
}
}
//loop though inpatient bills
$inpatient_bills = \Streamline\Models\InpatientBill::where('patient_id', $patient_id_to_delete)->get();
if (count($inpatient_bills) > 0) {
foreach ($inpatient_bills as $inpatient_bill) {
$inpatient_bill->patient_id = $patient_id;
$inpatient_bill->update();
}
}
//loop though ward bed stays
$ward_bed_stay = \Streamline\Models\WardBedStay::where('patient_id', $patient_id_to_delete)->get();
if (count($ward_bed_stay) > 0) {
foreach ($ward_bed_stay as $bed_stay) {
$bed_stay->patient_id = $patient_id;
$bed_stay->update();
}
}
//loop though ward consultation and service
$ward_consultations_and_services = \Streamline\Models\WardConsultationsAndService::where('patient_id', $patient_id_to_delete)->get();
if (count($ward_consultations_and_services) > 0) {
foreach ($ward_consultations_and_services as $ward_consultation) {
$ward_consultation->patient_id = $patient_id;
$ward_consultation->update();
}
}
//loop though ward extras
$ward_extras = \Streamline\Models\WardExtra::where('patient_id', $patient_id_to_delete)->get();
if (count($ward_extras) > 0) {
foreach ($ward_extras as $ward_extra) {
$ward_extra->patient_id = $patient_id;
$ward_extra->update();
}
}
//loop though ward comments
$ward_comments = \Streamline\Models\WardInpatientSheetComment::where('patient_id', $patient_id_to_delete)->get();
if (count($ward_comments) > 0) {
foreach ($ward_comments as $ward_comment) {
$ward_comment->patient_id = $patient_id;
$ward_comment->update();
}
}
//loop though ward investigation pricing
$ward_investigation_pricing = \Streamline\Models\WardInvestigationPricing::where('patient_id', $patient_id_to_delete)->get();
foreach ($ward_investigation_pricing as $ward_inv_pricing) {
$ward_inv_pricing->patient_id = $patient_id;
$ward_inv_pricing->update();
}
//loop though ward procedures
$ward_procedures = \Streamline\Models\WardProcedure::where('patient_id', $patient_id_to_delete)->get();
foreach ($ward_procedures as $ward_procedure) {
$ward_procedure->patient_id = $patient_id;
$ward_procedure->update();
}
//loop though ward sundries
$ward_sundries = \Streamline\Models\WardSundryDispensation::where('patient_id', $patient_id_to_delete)->get();
foreach ($ward_sundries as $ward_sundry) {
$ward_sundry->patient_id = $patient_id;
$ward_sundry->update();
}
//loop though ward treatment
$ward_treatments = \Streamline\Models\WardTreatment::where('patient_id', $patient_id_to_delete)->get();
foreach ($ward_treatments as $ward_treatment) {
$ward_treatment->patient_id = $patient_id;
$ward_treatment->update();
}
$ward_treatment_dispensations = \Streamline\Models\WardTreatmentDispensation::where('patient_id', $patient_id_to_delete)->get();
foreach ($ward_treatment_dispensations as $ward_treatment_dispensation) {
$ward_treatment_dispensation->patient_id = $patient_id;
$ward_treatment_dispensation->update();
}
//loop through investigation deposits
$investigation_deposits = \Streamline\Models\InvestigationDeposit::where('patient_id', $patient_id_to_delete)->get();
foreach ($investigation_deposits as $inv_deposit) {
$inv_deposit->patient_id = $patient_id;
$inv_deposit->update();
}
//loop through treatment deposits
$treatment_deposits = \Streamline\Models\TreatmentDeposits::where('patient_id', $patient_id_to_delete)->get();
foreach ($treatment_deposits as $treatment_deposit) {
$treatment_deposit->patient_id = $patient_id;
$treatment_deposit->update();
}
//loop through service deposits
$service_deposits = \Streamline\Models\ServiceDeposit::where('patient_id', $patient_id_to_delete)->get();
foreach ($service_deposits as $service_deposit) {
$service_deposit->patient_id = $patient_id;
$service_deposit->update();
}
//loop through procedure deposits
$procedure_deposits = \Streamline\Models\ProcedureDeposit::where('patient_id', $patient_id_to_delete)->get();
foreach ($procedure_deposits as $procedure_deposit) {
$procedure_deposit->patient_id = $patient_id;
$procedure_deposit->update();
}
//loop through sundries deposits
$sundry_deposits = \Streamline\Models\SundryDeposit::where('patient_id', $patient_id_to_delete)->get();
foreach ($sundry_deposits as $sundry_deposit) {
$sundry_deposit->patient_id = $patient_id;
$sundry_deposit->update();
}
//loop through patient category invoice
$patient_category_invoices = \Streamline\Models\PatientCategoryInvoice::where('patient_id', $patient_id_to_delete)->get();
if (count($patient_category_invoices) > 0) {
foreach ($patient_category_invoices as $patient_category_invoice) {
$patient_category_invoice->patient_id = $patient_id;
$patient_category_invoice->update();
}
}
//loop through patient dependants incase they were category dependant
$does_patient_to_delete_category_have_threshold = does_patient_category_have_threshold(get_name($patient_id_to_delete,'id','category_id', 'patients'));
$patient_is_a_dependant_of = patient_is_a_dependant_of($patient_id);
if($does_patient_to_delete_category_have_threshold == true || !is_null($patient_is_a_dependant_of)){
//the patient is on a patient dependants category if we go inside this "if" statement
$previous_main_dependant_to_delete = \Streamline\Models\CategoryPatientDependant::where('main_patient_id',$patient_id_to_delete)->first();
if ($previous_main_dependant_to_delete) {
$previous_main_dependant_to_delete->main_patient_id = $patient_id;
$previous_main_dependant_to_delete->update();
}
$record_where_duplicate_patient_is_dependant = \Streamline\Models\CategoryPatientDependant::whereRaw('FIND_IN_SET(' . $patient_id_to_delete . ',dependant_patient_ids)')->first();
if ($record_where_duplicate_patient_is_dependant) {
$array_with_new_patient_id = [];
$array_where_patient_to_delete_is_dependant = explode(",", $record_where_duplicate_patient_is_dependant->dependant_patient_ids);
for ($i=0; $i < count($array_where_patient_to_delete_is_dependant) ; $i++) {
$member = $array_where_patient_to_delete_is_dependant[$i];
if ($array_where_patient_to_delete_is_dependant[$i] == $patient_id_to_delete) {
$member = $patient_id;
}
$array_with_new_patient_id[] = $member;
}
$record_where_duplicate_patient_is_dependant->dependant_patient_ids = implode(",", $array_with_new_patient_id);
$record_where_duplicate_patient_is_dependant->update();
}
$main_dependants_consumptions = \Streamline\Models\DependantsConsumption::where('main_patient_id', $patient_id_to_delete)->get();
if (count($main_dependants_consumptions)) {
foreach ($main_dependants_consumptions as $main_patient_consumption) {
$main_patient_consumption->main_patient_id = $patient_id;
$main_patient_consumption->update();
}
}
$dependants_consumptions = \Streamline\Models\DependantsConsumption::where('dependant_patient_id', $patient_id_to_delete)->get();
if (count($dependants_consumptions)) {
foreach ($dependants_consumptions as $consumption) {
$consumption->dependant_patient_id = $patient_id;
$consumption->update();
}
}
}
//loop through discounts
$discounts = \Streamline\Models\Discount::where('patient_id', $patient_id_to_delete)->get();
if (count($discounts) > 0) {
foreach ($discounts as $discount_record) {
$discount_record->patient_id = $patient_id;
$discount_record->update();
}
}
$tables = ['ward_inpatient_sheet_nurse_comments','patient_accounts_deposits','patient_dispensings','patient_dispensings','patient_accounts_refunds','prescription_errors', 'patient_messages_from_app','ward_investigation_pricings','patient_clinic_transfers','clinic_transfers','staff_performed_services','ward_inpatient_detailed_notes','ward_dispensing_per_charts','patient_documents','patient_one_off_discounts','triage_nutrition','triage_news','surgeries','sundries_deposits','smart_triage','payrolls','patient_refunds','patient_account_consumptions','patient_appointments','phone_followup_patients','point_of_sale_records','cancelled_patient_opd_dispensations','procedure_deposits','cancel_patient_transactions','central_billing_deposits','chronic_patients','chi_deposits','debtors','debtor_payments','debt_plan','family_account_consumptions','inpatient_attendant_passes','inpatient_ward_discounts','internal_ward_transfers','inpatient_sheet_audits','maternity_delivery_records','maternity_inpatients','mental_health_consultation','ordered_investigations','ordered_procedures'];
foreach ($tables as $table) {
$episodes = DB::table($table)->where('patient_id', $patient_id_to_delete)->get();
foreach ($episodes as $episode) DB::table($table)->where('id', $episode->id)->update(['patient_id' => $patient_id]);
}
$incoming_ward_charts = DB::table('incoming_ward_charts')->whereRaw('FIND_IN_SET(' . $patient_id_to_delete . ', patient_ids)')->get();
foreach ($incoming_ward_charts as $incoming_ward_chart) {
$episode_ids = explode(',',$incoming_ward_chart->patient_ids);
foreach ($episode_ids as $key => $episode_id) if( $episode_id == $patient_id_to_delete) $episode_ids[$key]=$patient_id;
DB::table('incoming_ward_charts')->where('id', $incoming_ward_chart->id)->update(['patient_ids' => implode(',', $episode_ids)]);
}
$category_patient_dependants = DB::table('category_patient_dependants')->whereRaw('FIND_IN_SET(' . $patient_id_to_delete . ', dependant_patient_ids)')->get();
foreach ($category_patient_dependants as $category_patient_dependant) {
$episode_ids = explode(',',$category_patient_dependant->dependant_patient_ids);
foreach ($episode_ids as $key => $episode_id) if($episode_id == $patient_id_to_delete) $episode_ids[$key]=$patient_id;
DB::table('category_patient_dependants')->where('id', $category_patient_dependant->id)->update(['dependant_patient_ids' => implode(',', $episode_ids)]);
}
$main_patient_ids = DB::table('category_patient_dependants')->where('main_patient_id', $patient_id_to_delete)->get();
foreach ($main_patient_ids as $main_patient_id) DB::table('category_patient_dependants')->where('id', $main_patient_id->id)->update(['main_patient_id' => $patient_id]);
$family_members_ids = DB::table('family_accounts')->whereRaw('FIND_IN_SET(' . $patient_id_to_delete . ', family_members_ids)')->get();
foreach ($family_members_ids as $family_members_id) {
$episode_ids = explode(',',$family_members_id->family_members_ids);
foreach ($episode_ids as $key => $episode_id) if($episode_id == $patient_id_to_delete) $episode_ids[$key]=$patient_id;
DB::table('family_accounts')->where('id', $family_members_id->id)->update(['family_members_ids' => implode(',', $episode_ids)]);
}
$family_head_ids = DB::table('family_accounts')->where('family_head_id', $patient_id_to_delete)->get();
foreach ($family_head_ids as $family_head_id) DB::table('family_accounts')->where('id', $family_head_id->id)->update(['family_head_id' => $patient_id]);
// update the session ids with the remaining one
session()->put('patient_id', $patient_id);
flash("Records have been merged")->success();
return redirect('/possible_duplicate_patients/' .$patient_id);
}
flash("Oops. Merge has failed. Contact your system admin")->error();
return redirect()->back()->withInput();
}
public function patient_appointments_report(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;
//dd($request->all());
$clinics = Clinic::where('available', 1)->pluck('name', 'id')->prepend(['' => 'All clinics']);
$today = Carbon::now()->toDateString();
$filters = [];
$clinic_name = Clinic::where('id',$clinic_id)->pluck('name')->first();
if($search_by == 0){
array_push($filters, ['appointment_date', '<', $today]);
}elseif($search_by == 1){
// custom date
$start_date_search = Carbon::parse($reg_date)->toDateString();
array_push($filters, ['appointment_date', '=', $start_date_search]);
} elseif($search_by == 2){
// custom date range
$start_date_search = Carbon::parse($start_date)->toDateString();;
$end_date_search = Carbon::parse($end_date)->toDateString();;
array_push($filters, ['appointment_date', '>', $start_date_search]);
array_push($filters, ['appointment_date', '<', $end_date_search]);
} else{
array_push($filters, ['appointment_date', '<', $today]);
}
if($clinic_id == 0 || is_null($clinic_id)){
if ($request->appointment_outcome != 'all') {
$patient_appointments = PatientAppointment::where($filters)->where(['appointment_fulfilled' => $request->appointment_outcome])->orderBy('appointment_date', 'desc')->paginate(500);
} else {
$patient_appointments = PatientAppointment::where($filters)->orderBy('appointment_date', 'desc')->paginate(500);
}
} else {
if ($request->appointment_outcome != 'all') {
$patient_appointments = PatientAppointment::where(['clinic_allocation' => $clinic_id])->where(['appointment_fulfilled' => $request->appointment_outcome])->where($filters)->orderBy('appointment_date', 'desc')->paginate(400);
} else{
$patient_appointments = PatientAppointment::where(['clinic_allocation' => $clinic_id])->where($filters)->orderBy('appointment_date', 'desc')->paginate(400);
}
}
return view('patients::patients.appointments_report', compact('clinics', 'patient_appointments'));
}
public function view_dna_patient_demographic(Request $request)
{
$patient_id = $request->patient_id;
$patient = Patient::withTrashed()->find($patient_id);
$code = "";
$x = 1;
if($patient){
$code .= "<tr>";
$code .= "<th><b>";
$code .= "Name:";
$code .= "</b></th>";
$code .= "<td>";
$code .= insurance_flag($patient->id);
$code .= "</td>";
$code .= "<th><b>";
$code .= "Number:";
$code .= "</b></th>";
$code .= "<td>";
$code .= $patient->number;
$code .= "</td>";
$code .= "</tr>";
$code .= "<tr>";
$code .= "<th><b>";
$code .= "Patient Category";
$code .= "</b></th>";
$code .= "<td>";
$code .= get_name($patient->category_id, "id", "name", "patient_categories");
$code .= "</td>";
$code .= "<th><b>";
$code .= "Phone Number";
$code .= "</b></th>";
$code .= "<td>";
$code .= $patient->phone;
$code .= "</td>";
$code .= "</tr>";
} else {
$code .= "<tr><td colspan='8'><h4>No record in the system</h4></td></tr>";
}
return $code;
}
public function store_appointment_comment(Request $request)
{
$patient_id = $request->patient_id;
$appointment_id = $request->set_appointment_id;
$appointment_comment = $request->appointment_comment;
$appointment = PatientAppointment::find($appointment_id);
$appointment->action_comment = $appointment_comment;
$appointment->action_comment_by = Auth::user()->id;
// reassign the appointment_fulfilled to 2, indicating cancelled
// $appointment->appointment_fulfilled = 2;
if ($appointment->save()){
return 1;
} else {
return 0;
}
}
public function delete_patient_with_reason(Request $request){
$patient = Patient::findOrFail($request->patient_id);
$patient->deleted_by = auth()->user()->id;
$patient->update();
$patient_deactivation_reasons = new \Streamline\Models\PatientDeactivationReason;
$patient_deactivation_reasons->patient_id = $request->patient_id;
$patient_deactivation_reasons->reason = $request->patient_deactivation_reasons;
$patient_deactivation_reasons->save();
if ($patient_deactivation_reasons->save() && $patient->delete()){
flash("Patient has been deleted.")->success();
return 1;
} else {
return 0;
}
}
public function search(Request $request) {
$patient_number_search = $request->number;
$first_name_search = $request->first_name;
$last_name_search = $request->last_name;
$village_search = $request->village;
$full_name_search = $request->full_name;
$criteria = "";
$filters = [];
$patient_numbers = DB::table('patients')->whereNull('deleted_at')->orderBy('number')->distinct()->pluck('number');
$first_names = [];//DB::table('patients')->whereNull('deleted_at')->orderBy('first_name')->distinct()->pluck('first_name');
$last_names = [];//DB::table('patients')->whereNull('deleted_at')->orderBy('last_name')->distinct()->pluck('last_name');
$villages = DB::table('villages')->whereNull('deleted_at')->orderBy('name')->distinct()->pluck('name');
$full_names = Patient::all(['first_name', 'last_name', 'number', 'phone'])->pluck("full_name");
if ($patient_number_search) {
$filters[] = ['number', 'LIKE', '%' . $patient_number_search . '%'];
$criteria .= 'Number (' . $patient_number_search . ') ';
}
if ($first_name_search) {
$filters[] = ['first_name', 'LIKE', '%' . $first_name_search . '%'];
$criteria .= 'First name (' . $first_name_search . ') ';
}
if ($last_name_search) {
$filters[] = ['last_name', 'LIKE', '%' . $last_name_search . '%'];
$criteria .= 'Last name (' . $last_name_search . ') ';
}
if ($full_name_search) {
$split_full_name_array = explode(' ', $full_name_search);
if (is_array($split_full_name_array)) {
$first_name_from_split = isset($split_full_name_array[0]) ? $split_full_name_array[0] : "";
$last_name_from_split = isset($split_full_name_array[1]) ? $split_full_name_array[1] : "";
$patient_number_from_split = isset($split_full_name_array[count($split_full_name_array)-2]) ? $split_full_name_array[count($split_full_name_array)-2] : "";
$phone_number_in_brackets_from_split = end($split_full_name_array);
$phone_number = str_replace(array('(',')'), '',$phone_number_in_brackets_from_split);
//just only use the patient number from the full name submitted
if ($patient_number_from_split != "") {
$filters[] = ['number', 'LIKE', '%' . $patient_number_from_split . '%'];
$criteria .= 'Number (' . $patient_number_from_split . ') ';
} else{
$filters[] = ['first_name', 'LIKE', '%' . $first_name_from_split . '%'];
$criteria .= 'Last name (' . $full_name_search . ') ';
}
} else{
//just only use the patient number from the full name submitted
$filters[] = ['first_name', 'LIKE', '%' . $full_name_search . '%'];
$criteria .= 'Name (' . $full_name_search . ') ';
}
}
if ($village_search) {
$village_id = DB::table('villages')->where(['name' => $village_search])->pluck('id')->first();
if (!empty($village_id)) {
$filters[] = ['village_id', 'LIKE', '%' . $village_id . '%'];
$criteria .= 'Village (' . $village_search . ') ';
}
}
$categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id");
$marital_statuses = DB::table('marital_statuses')->pluck("name", "id");
$patient_villages = DB::table('villages')->pluck("name", "id");
if (empty($criteria)) :
$criteria = 'No results found for search';
$patients = DB::table('patients')->whereNull('deleted_at')->orderBy('id', 'desc')->paginate(200);
$resultCount = DB::table('patients')->whereNull('deleted_at')->orderBy('id', 'desc')->count();
else:
$patients = DB::table('patients')->whereNull('deleted_at')->orderBy('id', 'desc')->where($filters)->paginate(200);
$resultCount = DB::table('patients')->whereNull('deleted_at')->orderBy('id', 'desc')->where($filters)->count();
endif;
$patientCount = DB::table('patients')->whereNull('deleted_at')->count();
return view('patients::patients.index', compact('patients', 'categories', 'marital_statuses', 'patient_numbers', 'first_names', 'last_names', 'villages',
'patient_villages', 'patientCount', 'resultCount', 'criteria', 'full_names'));
}
public function quick_add_residence(Request $request) {
$district_id = $request->district_id;
$new_district_name = $request->new_district_name;
$county_id = $request->county_id;
$new_county_name = $request->new_county_name;
$subcounty_id = $request->subcounty_id;
$new_subcounty_name = $request->new_subcounty_name;
$parish_id = $request->parish_id;
$new_parish_name = $request->new_parish_name;
$village_id = 0;
$new_village_name = $request->new_village_name;
if (!isset($district_id) && isset($new_district_name)) {
$district = new District;
$district->name = $new_district_name;
$district->created_by = Auth::user()->id;
$district->updated_by = Auth::user()->id;
$district->save();
$district_id = $district->id;
}
if (!isset($county_id) && isset($new_county_name) && is_numeric($district_id)) {
$county = new County;
$county->name = $new_county_name;
$county->district_id = $district_id;
$county->created_by = Auth::user()->id;
$county->updated_by = Auth::user()->id;
$county->save();
$county_id = $county->id;
}
if (!isset($subcounty_id) && isset($new_subcounty_name) && is_numeric($county_id)) {
$sub_county = new Subcounty;
$sub_county->name = $new_subcounty_name;
$sub_county->county_id = $county_id;
$sub_county->created_by = Auth::user()->id;
$sub_county->updated_by = Auth::user()->id;
$sub_county->save();
$subcounty_id = $sub_county->id;
}
if (!isset($parish_id) && isset($new_parish_name) && is_numeric($subcounty_id)) {
$parish = new Parish;
$parish->name = $new_parish_name;
$parish->subcounty_id = $subcounty_id;
$parish->created_by = Auth::user()->id;
$parish->updated_by = Auth::user()->id;
$parish->save();
$parish_id = $parish->id;
}
if (isset($new_village_name)) {
$village = new Village;
$village->name = $new_village_name;
$village->parish_id = is_numeric($parish_id) ? $parish_id : 0;
$village->created_by = Auth::user()->id;
$village->updated_by = Auth::user()->id;
$village->save();
$village_id = $village->id;
}
return (is_numeric($village_id) ? $village_id : 0) . "," . (is_numeric($parish_id) ? $parish_id : 0) . "," . (is_numeric($subcounty_id) ? $subcounty_id : 0) . "," .
(is_numeric($county_id) ? $county_id : 0) . "," . (is_numeric($district_id) ? $district_id : 0);
}
public function get_fingerprint($id) {
$patient = DB::table('patients')->where('id', $id)->first();
if($patient && $patient->fingerprint_template) {
return $patient->fingerprint_template;
} else {
return "0";
}
}
public function fetch_fingerprint_from_scanner() {
$response = Http::get('http://localhost:13124/cams/fp-scanner/capture?sendimage=1&apikey=' . get_fingerprint_key());
$scanner_response = json_decode($response, true);
$template = $scanner_response["ApiRequestInfo"]["OperationData"]["Signature"][0]["Template"];
$pngImage = $scanner_response["ApiRequestInfo"]["OperationData"]["Signature"][0]["Image"];
$error_code = $scanner_response["ScannerError"]["errorCode"];
$error_message = $scanner_response["ScannerError"]["errorString"];
return json_encode([
"template" => $template,
"image" => $pngImage,
"error_code" => $error_code,
"error_message" => $error_message,
]);
}
public function compare_fingerprint_from_scanner(Request $request) {
$fingerprint_template = $request->fingerprint_template;
$saved_fingerprint_template = $request->saved_fingerprint_template;
$response = Http::get('http://localhost:13124/cams/fp-scanner/compare?apikey=' . get_fingerprint_key() . '&tmpl1=' . $fingerprint_template . '&tmpl2=' . $saved_fingerprint_template);
$scanner_response = json_decode($response, true);
$score = $scanner_response["ApiRequestInfo"]["OperationData"]["Score"];
$error_code = $scanner_response["ScannerError"]["errorCode"];
$error_message = $scanner_response["ScannerError"]["errorString"];
return json_encode([
"score" => $score,
"error_code" => $error_code,
"error_message" => $error_message,
]);
}
public function patient_card($id)
{
$patient = Patient::find($id);
$hospital_details = \Streamline\Models\HospitalInformation::first();
$data = [
'hospitalInfo' => $hospital_details,
'patient' => $patient
];
$pdf = SnappyPDF::loadView('patients::patients/patient_card', $data)
->setOrientation('portrait')
->setOption('margin-bottom', 7)
->setOption('margin-top', 5)
->setOption('footer-html', '<i>Stre@mline</i>');
return $pdf->inline('Patient Card' . date(" d-m-y h:ia") . '.pdf');
}
}