Files

541 lines
22 KiB
PHP
Executable File

<?php
namespace Modules\WardManagement\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Database\Query\Builder;
use Illuminate\Http\Request;
use Streamline\Models\ChartOfAccount;
use Streamline\Models\StreamlineSetupStep;
use Streamline\Models\Ward;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\QueryException;
use Streamline\Models\InpatientInfo;
use Streamline\Models\Patient;
use Streamline\Models\PatientEpisode;
use Streamline\Models\WardStock;
use Streamline\Models\HmisWard;
use Streamline\Models\WardStockReconciliation;
use Streamline\Services\StreamlineSetupServiceInterface;
class WardController extends Controller {
public function __construct(
protected StreamlineSetupServiceInterface $setupService
) {
$this->middleware('auth');
$this->middleware('permission:ward-list', ['only' => ['index', 'select']]);
$this->middleware('permission:ward-create', ['only' => ['create', 'store']]);
$this->middleware('permission:ward-edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:ward-delete', ['only' => ['destroy', 'inactive', 'activate']]);
}
public static $ward_types = ['maternity' => 'Maternity Ward', 'theatre' => 'Theatre Ward', 'psychiatric'=>'Psychiatric ward','emergency'=>'Emergency ward'];
/**
* Display a listing of the resource.
*/
public function index()
{
$wards = DB::table('wards')->leftJoin('hmis_wards', 'hmis_wards.id', '=', 'wards.hmis_ward_id')->whereNull('wards.deleted_at')
->select('wards.*', 'hmis_wards.name as hmis_ward')->orderby('name', 'asc')->get();
$inpatient_wards = InpatientInfo::distinct('ward_id')->pluck('ward_id', 'ward_id')->toArray();
$ward_types = static::$ward_types;
return view('ward_management::wards.index', compact('wards', 'inpatient_wards', 'ward_types'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$wards = ['CHILDREN', 'MEDICAL LOWER (ISOLATION)', 'MATERNITY', 'MEDICAL UPPER', 'PSYCHIATRY Ahumuza Centre', 'REHABILITATION', 'SPECIAL CARE BABY UNIT', 'SURGICAL MALE', 'SURGICAL FEMALE', 'THEATRE', 'OPD', 'NIGHT NURSES CUPBOARD', 'DEMO TEST WARD', 'SCHOOL OF NURSING', 'GYNAECOLOGY WARD'];
$ward_types = HmisWard::all('name', 'id');
$actual_ward_types = static::$ward_types;
return view('ward_management::wards.create', compact('wards', 'ward_types', 'actual_ward_types'));
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//validation passed
if (isset($request->skip)&& $request->skip == 'skip') {
//update the streamline setup table with the new finished step
$this->setupService->saveStep("wards registration", 1);
return redirect("service_items/create");
} else {
$ward = new Ward;
$ward->name = $request->name;
$ward->available = $request->available;
$ward->beds = $request->beds;
$ward->hmis_ward_id = $request->type;
$ward->type = $request->ward_type;
if ($request->type == '4') $ward->slug = 'maternity';
$ward->created_by = Auth::id();
try {
if (!is_null($ward->name)) {
$ward->save();
}
if (session()->has('streamline_setup')) {
if (isset($request->other_wards)) {
$other_wards_array = $request->other_wards;
$other_beds_array = $request->other_ward_beds;
$other_ward_types_array = $request->other_ward_types;
for ($i = 0; $i < count($other_wards_array); $i++) {
$ward = new Ward;
$ward->name = $other_wards_array[$i];
$ward->beds = $other_beds_array[$i];
$ward->slug = $other_ward_types_array[$i];
$ward->created_by = Auth::id();
$ward->save();
}
}
if (isset($request->selected_wards)) {
$selected_wards_array = $request->selected_wards;
if (!empty($selected_wards_array)) {
for ($i = 0; $i < count($selected_wards_array); $i++) {
$ward = new Ward;
$ward->name = $selected_wards_array[$i];
$ward->beds = 0;
$ward->created_by = Auth::id();
$ward->save();
}
}
}
//update the streamline setup table with the new finished step
$this->setupService->saveStep("wards registration", 1);
flash("Wards have been added")->success();
return redirect("service_items/create");
}
flash($request->name . " Ward has been saved")->success();
return redirect("/wards/");
} catch (QueryException $e) {
flash("An error occurred")->error();
return back()->withInput();
}
}
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$ward = Ward::where(['id' => $id])->first();
$ward_types = HmisWard::all('name', 'id')->toArray();
$actual_ward_types = static::$ward_types;
$selected_ward_type = '';
if (!$ward) {
flash()->error("Ward not found");
return redirect('/wards/');
} else {
if (!empty($ward->hmis_ward_id)) {
$hmis_ward_id = $ward->hmis_ward_id;
$other_ward_types = array_filter($ward_types, function ($item) use ($hmis_ward_id) {
return $item['id'] !== $hmis_ward_id;
});
$selected_ward_type = array_filter($ward_types, function ($item) use ($hmis_ward_id) {
return $item['id'] == $hmis_ward_id;
});
} else $other_ward_types = $ward_types;
return view('ward_management::wards.edit', compact('ward', 'other_ward_types', 'selected_ward_type', 'actual_ward_types'));
}
}
/**
* 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([
'name' => 'required',
'beds' => 'required',
'type' => 'required'
]);
//validation passed
$ward = Ward::findOrFail($id);
$ward->name = $request->name;
$ward->beds = $request->beds;
$ward->available = $request->available;
$ward->hmis_ward_id = $request->type;
$ward->type = $request->ward_type;
if ($request->type == '4') $ward->slug = 'maternity';
$ward->updated_by = Auth::id();
try {
$ward->save();
flash($request->name . " Ward has been updated")->success();
return redirect("/wards/");
} 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)
{
$ward = Ward::findOrFail($id);
if ($ward->delete()) {
flash("Ward has been deleted.")->success();
return redirect('/wards/');
}
}
/**
* Display a listing of the inactive resource(s).
*
* @return \Illuminate\Http\Response
*/
public function inactive()
{
$wards = Ward::onlyTrashed()
->orderBy('name', 'asc')
->paginate(50);
if (empty($wards)) {
flash()->error("There is no inactive ward");
return redirect('/wards/');
} else {
return view('ward_management::wards.inactive', compact('wards'));
}
}
/**
* Activate the specified resource in storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function activate($id)
{
$ward = Ward::withTrashed()->find($id);
if ($ward->restore()) :
flash("Ward has been activated.")->success();
return redirect('/wards/inactive');
endif;
}
public function select(Request $request)
{
$ward_id = $request->ward_id;
$search_by = $request->search_by;
$reg_date = $request->reg_date;
$start_date = $request->start_date;
$end_date = $request->end_date;
$patient_id = $request->patient_id;
if (!isset($ward_id) && !isset($search_by)) {
$ward_id = session()->get('ward_id');
$search_by = session()->get('search_by');
$reg_date = session()->get('reg_date');
$start_date = session()->get('start_date');
$end_date = session()->get('end_date');
$patient_id = session()->get('ward_patient_id');
} else {
session()->put('ward_id', $ward_id);
session()->put('search_by', $search_by);
session()->put('reg_date', $reg_date);
session()->put('start_date', $start_date);
session()->put('end_date', $end_date);
session()->put('ward_patient_id', $patient_id);
}
$patient_id = empty($patient_id) ? false : $patient_id;
$ward_id = empty($ward_id) ? false : $ward_id;
if ($search_by === '0') {
$start_date = Carbon::today()->startOfCentury()->toDateTimeString();
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
} elseif($search_by == 2){
$start_date = Carbon::yesterday()->startOfDay()->toDateTimeString();
$end_date = Carbon::yesterday()->endOfDay()->toDateTimeString();
} elseif($search_by == 3 && !empty($reg_date)){
// custom date
$start_date = Carbon::createFromFormat('d/m/Y', $reg_date)->startOfDay()->toDateTimeString();
$end_date = Carbon::createFromFormat('d/m/Y', $reg_date)->endOfDay()->toDateTimeString();
} elseif($search_by == 4 && !(empty($start_date) || empty($end_date))){
// custom date range
$start_date = Carbon::createFromFormat('d/m/Y', $start_date)->startOfDay()->toDateTimeString();
$end_date = Carbon::createFromFormat('d/m/Y', $end_date)->endOfDay()->toDateTimeString();
} else {
$start_date = Carbon::now()->startOfDay()->toDateTimeString();
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
}
$inpatients = DB::table('inpatient_info as i')->leftJoin('patients as p', 'p.id','i.patient_id')->leftJoin('inpatient_bed_categories as b','b.id', 'i.bed_category_id')
->leftJoin('wards as w','w.id', 'i.ward_id')->leftJoin('triage as t','t.episode_id', 'i.episode_id')->leftJoin('diagnoses as d','d.id', 'i.primary_diagnosis')
->where('i.discharged', 0)
->when($ward_id, function (Builder $query, string $ward_id) {
$query->where('i.ward_id', $ward_id);
})
->when($patient_id, function (Builder $query, string $patient_id) {
$query->where('i.patient_id', $patient_id);
})
->whereBetween('i.created_at', [$start_date, $end_date])
->whereNull('p.deleted_at')
->select('i.episode_id', 'i.patient_id', 'i.id','i.bed_no','i.bed_category_id','i.admitted_on', 'i.primary_diagnosis', 'i.comments', 'i.ward_id',
'b.name as bed_category', 'p.number', 'p.gender','p.date_of_birth','w.slug', 't.severe_grade','d.name as primary_diagnosis_name')
->orderBy('i.created_at', 'desc')->get();
if (!is_null($ward_id)) {
if ($ward_id != 0) {
$search_text = get_name($ward_id, 'id', 'name', 'wards');
} else {
$search_text = 'All Wards';
}
} else {
$search_text = __('wards.no_ward_selected');
}
$search_text .= " From " . streamline_date($start_date) . " to " . streamline_date($end_date);
$wards = DB::table('wards')->where('available', 1)->whereNull('deleted_at')->orderBy('name')->pluck("name", "id")->toArray();
$wards = [0 => 'All Wards'] + $wards;
$wards = ['' => '- select -'] + $wards;
return view('ward_management::wards.select', compact('inpatients', 'wards', 'ward_id', 'search_text'));
}
/* submit bed category sent via ajax from the ward sheet containing patients */
public function submit_bed_category(Request $request)
{
$bed_category = $request->bed_category;
$inpatient_id = $request->inpatient_id;
$inpatient_info_collection = InpatientInfo::where(['id' => $inpatient_id])->get();
if (!is_null($inpatient_info_collection)) {
$inpatient_info = $inpatient_info_collection->first();
$inpatient_info->bed_category_id = $bed_category;
if ($inpatient_info->update()) {
return "success";
}
}
return "error";
}
/* submit bed number sent via ajax from the ward sheet containing patients */
public function submit_bed_number(Request $request)
{
$bed_number = $request->bed_no;
$inpatient_id = $request->inpatient_id;
$inpatient_info_collection = InpatientInfo::where(['id' => $inpatient_id])->get();
if (!is_null($inpatient_info_collection)) {
$inpatient_info = $inpatient_info_collection->first();
$inpatient_info->bed_no = $bed_number;
if ($inpatient_info->update()) {
return "success";
}
}
return "error";
}
/* submit ward message sent via ajax from the ward sheet containing patients */
public function submit_ward_message(Request $request)
{
$comments = $request->comment;
$patient_id = $request->patient_id;
$episode_id = $request->episode_id;
$inpatient_info_collection = InpatientInfo::where(['patient_id' => $patient_id, 'episode_id' => $episode_id])->get();
if (!is_null($inpatient_info_collection)) {
$inpatient_info = $inpatient_info_collection->first();
$inpatient_info->comments = $comments;
if ($inpatient_info->update()) {
return "success";
}
}
return "error";
}
//set episode and patient_id for selected patient
public function route_patient_episode(Request $request)
{
$episode_id = $request->episode_id;
$patient_id = PatientEpisode::find($episode_id)->patient_id;
session()->put('episode_id', $episode_id);
session()->put('patient_id', $patient_id);
switch ($request->submit) {
case 'triage':
return redirect('/triage/');
case 'consultation':
return redirect('/consultation/route');
case 'create_anaesthetics':
return redirect('anaesthetics/create');
case 'create_surgery':
return redirect('theatre_surgery/create');
case 'anaesthetics_history':
return redirect('anaesthetics/history');
case 'surgery_index':
return redirect('theatre_surgery');
case 'inpatient_sheet':
case 'maternity_summary':
return redirect('in_patient_sheet');
case 'inpatient_billing':
return redirect('inpatient_billing');
case 'maternity_admission':
// return redirect('maternity_inpatient_sheet');
return redirect('/maternity_admission/route');
break;
case 'labour_ward_admission':
return redirect('labour_ward_admission_sheet');
break;
case 'labour_ward_admission_sheet_details':
return redirect('labour_ward_admission_sheet_details');
break;
case 'edit_labour_ward_admission_sheet':
return redirect('edit_labour_ward_admission_sheet');
break;
case 'delivery_record':
return redirect('maternity_delivery_record');
case 'treatment_sheet':
session()->put(['treatment_sheet_route' => 'ward_home']);
return redirect('treatment_sheet/view');
default:
return redirect('/patient_episodes/');
}
}
public function drugs_stock_sheet(Request $request)
{
$ward_id = null;
$ward_stock_records = [];
$ward_id = $request->ward_id;
$wards = Ward::orderBy('name', 'asc')->pluck('name', 'id')->toArray();
$wards = ['' => '- select -'] + $wards;
if (!is_null($ward_id)) {
$ward_stock_records = WardStock::where(['ward_id' => $ward_id, 'item_type' => 1])->get();
}
return view('ward_management::wards.drugs_stock_sheet', compact('ward_stock_records', 'wards', 'ward_id'));
}
public function update_drugs_stock_sheet(Request $request)
{
$ward_id = $request->ward_id;
$batch_drugs_ids_array = $request->batch_drug_id;
$batch_watcher_ids_array = $request->item_batch_watcher_id;
$batch_numbers_array = $request->batch_number;
$batch_quantity_array = $request->batch_quantity;
$batch_unit_cost_array = $request->batch_unit_cost;
$batch_expiry_dates_array = $request->batch_expiry_date;
$batch_db_record_ids_array = $request->item_batch_watcher_id;
$stock_adjustment_chart_of_account = ChartOfAccount::where('slug', 'stock_adjustment')->first();
$affected_account_id = $stock_adjustment_chart_of_account->id;
for ($i = 0; $i < count($batch_drugs_ids_array); $i++) {
$max_stock_count_identifier = DB::table('ward_stock_reconciliations')->max('stock_count_identifier');
//enforce double entry per batch
account_for_batch_reconciliations_difference($item_type = 1, $batch_drugs_ids_array[$i], $affected_account_id, $batch_numbers_array[$i], $batch_quantity_array[$i], Carbon::now()->toDateString(), "ward", $ward_id);
reconcile_batches($item_type = 1, $batch_drugs_ids_array[$i], $batch_numbers_array[$i], $batch_quantity_array[$i], $batch_expiry_dates_array[$i], "ward", $batch_unit_cost_array[$i] ?? 0, $batch_db_record_ids_array[$i] ?? 0, $ward_id);
$physical_stock = new WardStockReconciliation;
$physical_stock->item_type = 1;
$physical_stock->item_id = $batch_drugs_ids_array[$i];
$physical_stock->physical_stock = $batch_quantity_array[$i];
$physical_stock->completion_status = 1;
$physical_stock->affected_account_id = $affected_account_id;
$physical_stock->general_comment = $request->general_comment;
$physical_stock->created_by = Auth::id();
$physical_stock->save();
//add the stock_count_identifier of the newly counted stock
$physical_stock_record_to_update = WardStockReconciliation::find($physical_stock->id);
$physical_stock_record_to_update->stock_count_identifier = $max_stock_count_identifier + 1; //increase ID by 1 for new
$physical_stock_record_to_update->update();
$drug_ward_stock = WardStock::where(['ward_id' => $ward_id, 'item_type' => 1, 'item_id' => $batch_drugs_ids_array[$i]])->first();
$drug_ward_stock->ward_item_stock = $batch_quantity_array[$i];
$drug_ward_stock->update();
}
flash("Ward stock has been updated")->success();
return redirect('ward_drugs_stock_sheet');
}
public function sundries_stock_sheet(Request $request)
{
$ward_id = null;
$ward_stock_records = [];
$ward_id = $request->ward_id;
$wards = Ward::orderBy('name', 'asc')->pluck('name', 'id')->toArray();
$wards = ['' => '- select -'] + $wards;
if (!is_null($ward_id)) {
$ward_stock_records = WardStock::where(['ward_id' => $ward_id, 'item_type' => 2])->get();
}
return view('ward_management::wards.sundries_stock_sheet', compact('ward_stock_records', 'wards', 'ward_id'));
}
public function update_sundries_stock_sheet(Request $request)
{
$ward_id = $request->ward_id;
$sundry_ids_array = $request->sundry_id;
$quantity_array = $request->quantity;
for ($i = 0; $i < count($sundry_ids_array); $i++) {
$sundry_ward_stock = WardStock::where(['ward_id' => $ward_id, 'item_type' => 2, 'item_id' => $sundry_ids_array[$i]])->first();
$sundry_ward_stock->ward_item_stock = $quantity_array[$i];
$sundry_ward_stock->update();
}
return redirect('ward_sundries_stock_sheet');
}
public function home()
{
return view('ward_management::wards.home');
}
}