middleware('auth'); $this->middleware('permission:pharmacy-incoming-prescriptions', ['only' => ['index']]); $this->middleware('permission:pharmacy-ward-dispensing', ['only' => ['store', 'ward_dispensing']]); $this->middleware('permission:pharmacy-stock-sheet', ['only' => ['stock_sheet']]); $this->middleware('permission:pharmacy-optical-stock-sheet', ['only' => ['pharmacy_optical_stock_sheet']]); $this->middleware('permission:pharmacy-drug-requisition', ['only' => ['requisition_for_drugs', 'store_requisition']]); $this->middleware('permission:pharmacy-saved-requisitions', ['only' => ['select_temporary_requisition', 'edit_temporary_requisition']]); $this->middleware('permission:pharmacy-previous-requisitions', ['only' => ['previous_drug_requisitions', 'edit_previous_requisition', 'update_previous_requisition']]); $this->middleware('permission:confirm-prescriptions', ['only' => ['confirm_prescriptions','confirm_dispensing_details','store_prescription_confirmation','view_dispensing_details_error']]); } /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $today = Carbon::today()->toDateString(); $display = "Report for ".streamline_date($today); if(is_incoming_prescriptions_feature_enabled()){ $pending_unpaid_prescriptions = Treatment::where(['confirmation_status' => 1,'dispense_status' => 0, 'payment_status'=> 0])->whereDate('created_at', $today)->orderBy('created_at', 'desc')->get(); $pending_paid_prescriptions = Treatment::where(['confirmation_status' => 1,'dispense_status' => 0, 'payment_status'=> 1])->whereDate('created_at', $today)->orderBy('created_at', 'desc')->get(); $confirmed_unpaid_prescriptions = Treatment::where(['confirmation_status' => 1,'dispense_status' => 1, 'payment_status'=> 0])->whereDate('created_at', $today)->orderBy('created_at', 'desc')->get(); $confirmed_paid_prescriptions = Treatment::where(['confirmation_status' => 1,'dispense_status' => 1, 'payment_status'=> 1])->whereDate('created_at', $today)->orderBy('created_at', 'desc')->get(); } else{ $pending_unpaid_prescriptions = Treatment::where(['dispense_status' => 0, 'payment_status'=> 0])->whereDate('created_at', $today)->orderBy('created_at', 'desc')->get(); $pending_paid_prescriptions = Treatment::where(['dispense_status' => 0, 'payment_status'=> 1])->whereDate('created_at', $today)->orderBy('created_at', 'desc')->get(); $confirmed_unpaid_prescriptions = Treatment::where(['dispense_status' => 1, 'payment_status'=> 0])->whereDate('created_at', $today)->orderBy('created_at', 'desc')->get(); $confirmed_paid_prescriptions = Treatment::where(['dispense_status' => 1, 'payment_status'=> 1])->whereDate('created_at', $today)->orderBy('created_at', 'desc')->get(); } $categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id"); return view('pharmacy::pharmacy.index', compact('pending_paid_prescriptions', 'pending_unpaid_prescriptions','confirmed_paid_prescriptions', 'confirmed_unpaid_prescriptions', 'categories', 'display')); } public function search(Request $request){ $categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id"); $display = dateLabelSetter2($request); $filters = []; if(is_incoming_prescriptions_feature_enabled()){ $filters[] = ['confirmation_status', '=', 1]; } if (isset($request->patient_id) && $request->patient_id != 0) { $filters[] = ['patient_id', '=', $request->patient_id]; $pending_unpaid_prescriptions = Treatment::where(['patient_id' => $request->patient_id,'dispense_status' => 0, 'payment_status'=> 0]) ->where($filters)->orderBy('created_at', 'desc')->get(); $pending_paid_prescriptions = Treatment::where(['patient_id' => $request->patient_id,'dispense_status' => 0, 'payment_status'=> 1]) ->where($filters)->orderBy('created_at', 'desc')->get(); $confirmed_unpaid_prescriptions = Treatment::where(['patient_id' => $request->patient_id,'dispense_status' => 1, 'payment_status'=> 0]) ->where($filters)->orderBy('created_at', 'desc')->get(); $confirmed_paid_prescriptions = Treatment::where(['patient_id' => $request->patient_id,'dispense_status' => 1, 'payment_status'=> 1]) ->where($filters)->orderBy('created_at', 'desc')->get(); } else { switch ($request->dates){ case 'today': $end = Carbon::today()->endOfDay(); $start = Carbon::today()->startOfDay(); break; case 'yesterday': $end = Carbon::yesterday()->endOfDay(); $start = Carbon::yesterday()->startOfDay(); break; case 'custom_date': $end = Carbon::parse($request->start_date)->endOfDay(); $start = Carbon::parse($request->start_date)->startOfDay(); break; case 'custom_date_range': $end = Carbon::parse($request->end_date)->endOfDay(); $start = Carbon::parse($request->start_date)->startOfDay(); } $pending_unpaid_prescriptions = Treatment::where(['dispense_status' => 0, 'payment_status'=> 0]) ->whereBetween('created_at',[$start, $end])->where($filters)->orderBy('created_at', 'desc')->get(); $pending_paid_prescriptions = Treatment::where(['dispense_status' => 0, 'payment_status'=> 1]) ->whereBetween('created_at',[$start, $end])->where($filters)->orderBy('created_at', 'desc')->get(); $confirmed_unpaid_prescriptions = Treatment::where(['dispense_status' => 1, 'payment_status'=> 0]) ->whereBetween('created_at',[$start, $end])->where($filters)->orderBy('created_at', 'desc')->get(); $confirmed_paid_prescriptions = Treatment::where(['dispense_status' => 1, 'payment_status'=> 1]) ->whereBetween('created_at',[$start, $end])->where($filters)->orderBy('created_at', 'desc')->get(); } return view('pharmacy::pharmacy.index', compact('pending_paid_prescriptions', 'pending_unpaid_prescriptions','confirmed_paid_prescriptions', 'confirmed_unpaid_prescriptions', 'categories', 'display')); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a new ward dispensing * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // check if any drug has been selected if(is_array($request->drug_id)){ $ward_id = $request->ward; $dispensation_date = Carbon::createFromFormat('d/m/Y', $request->dispensation_date)->toDateString(); $drug_id_array = $request->drug_id; $quantity_returned_array = $request->quantity_returned; $quantity_dispensed_array = $request->quantity_dispensed; $total_array = $request->total; $stock_array = $request->stock; $pharmacy_comment_array = $request->pharmacy_comment; for ($x = 0; $x < count($drug_id_array); $x++) { //Incrementing the quantity in the drugs table with quantity returned every time the query runs $drug = Drug::find($drug_id_array[$x]); $new_stock_after_return = $drug->pharmacy_stock + $quantity_returned_array[$x]; $drug->pharmacy_stock = $new_stock_after_return; $drug->updated_by = Auth::id(); $drug->updated_at = Carbon::now(); $drug->update(); //Decrementing the quantity in the drugs table with the quantity dispensed every time the query runs $new_stock_after_dispensing = $drug->pharmacy_stock - $quantity_dispensed_array[$x]; $drug->pharmacy_stock = $new_stock_after_dispensing; $drug->updated_by = Auth::id(); $drug->updated_at = Carbon::now(); $drug->update(); } //Run the query to insert the ward dispensing into the ward dispensing table $ward_dispensing = new WardDispensing; $ward_dispensing->ward_id = $ward_id; $ward_dispensing->drug_id = implode(',', $drug_id_array); $ward_dispensing->quantity_returned = implode(',', $quantity_returned_array); $ward_dispensing->quantity_dispensed = implode(',', $quantity_dispensed_array); $ward_dispensing->stock = implode(',', $stock_array); $ward_dispensing->total = implode(',', $total_array); $ward_dispensing->dispensation_date = $dispensation_date; $ward_dispensing->comment = implode(',', $pharmacy_comment_array); $ward_dispensing->received_by = $request->received_by; $ward_dispensing->created_by = Auth::id(); if ($ward_dispensing->save()) { flash('Drugs have been successfully dispensed')->success(); return redirect('ward_dispensing'); } flash('Error in dispensing. Kindly contact the system admin ')->error(); return redirect()->back(); } else { flash('Error in dispensing. Kindly contact the system admin ')->error(); return redirect()->back(); } } /** * 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) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } /* view dispensing details */ public function view_dispensing_details(Request $request) { $treatment_id = $request->treatment_id; $patient_id = $request->patient_id; $episode_id = $request->episode_id; $patient = Patient::where(['id' => $patient_id])->first(); $treatment = Treatment::find($treatment_id); $previous_treatments = Treatment::where('patient_id',$patient_id)->where('episode_id', '!=', $episode_id)->take(5)->get(); return view('pharmacy::pharmacy.view_dispensing_details', compact('patient_id', 'treatment_id', 'patient', 'treatment', 'previous_treatments')); } /** * Return to dispensing view with errors * * @param $treatment_id * @param $patient_id * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function view_dispensing_details_error($treatment_id, $patient_id) { $patient = Patient::where(['id' => $patient_id])->first(); $categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id"); $marital_statuses = DB::table('marital_statuses')->pluck("name", "id"); $drug_categories = DB::table('drug_categories')->get(); $treatment = Treatment::find($treatment_id); //allergies and alerts $known_patient_allergies = Allergy::where('patient_id', $patient_id)->orderBy('created_at', 'desc')->take(2)->get(); $known_patient_alerts = Alert::where('patient_id', $patient_id)->orderBy('created_at', 'desc')->take(2)->get(); $drug_categories_array = DB::table('drug_categories')->pluck('name', 'id'); return view('pharmacy::pharmacy.view_dispensing_details', compact('patient_id', 'treatment_id', 'patient', 'categories', 'marital_statuses', 'drug_categories', 'treatment', 'known_patient_alerts', 'known_patient_allergies', 'drug_categories_array')); } /* dispense prescriptions */ public function dispense_prescription(Request $request) { $patient_id = $request->patient_id; $treatment_id = $request->treatment_id; $drug_ids_array = $request->drug_id; $quantity_to_dispense_array = $request->quantity_to_dispense; $dose_array = $request->dose; $dose_2_array = isset($request->dose2) ? $request->dose2 : []; $frequency_array = $request->frequency; $duration_array = $request->duration; $instructions_to_patient_array = $request->instructions; $to_take_away = $request->tta; $comment = $request->comment; $purchased_elsewhere = $request->purchased_elsewhere; $purchased_elsewhere_array = []; /* 1.reduce pharmacy_stock of that drug that's been dispensed 2.insert into patient_dispensing 3.insert into prescription error if there is one 4.update treatment and set dispense status to 1 where id = treatment_id. 5.issue patient dispensed receipt */ for ($x = 0; $x < count($drug_ids_array); $x++) { if (isset($purchased_elsewhere) && count($purchased_elsewhere) > 0 && in_array($drug_ids_array[$x], $purchased_elsewhere)) { $purchased_elsewhere_array[] = 1; } else { $drug = Drug::find($drug_ids_array[$x]); if ($drug) { if (get_inventory_reduction_point() == 1) { $current_stock = $drug->pharmacy_stock; $new_stock = $current_stock - $quantity_to_dispense_array[$x]; $drug->pharmacy_stock = $new_stock; $drug->update(); } } else { $quantity_to_dispense_array[$x] = 0; } $purchased_elsewhere_array[] = 0; } } /* ========= batch calculations =========== */ $batch_drug_ids_array = $request->batch_drug_id; $batched_dispensed_array = $request->batch_dispensed_from?? []; $batch_quantity_dispensed_array = $request->batch_quantity_to_dispense; for ($x = 0; $x < count($batched_dispensed_array); $x++) { if (isset($purchased_elsewhere) && count($purchased_elsewhere) > 0 && in_array($batch_drug_ids_array[$x] ?? 0, $purchased_elsewhere)){ //in purchased elsewhere so do not reduce } else{ if (get_inventory_reduction_point() == 1) { reduce_batch_item_stock($item_type = 1,$batch_drug_ids_array[$x],$batched_dispensed_array[$x]??0, 'drugs', 'pharmacy_stock',$batch_quantity_dispensed_array[$x] ?? 0, 'treatments','Dispensing', $treatment_id, $patient_id); // reduce_batch_item_from_pharmacy($item_type = 1, $batch_drug_ids_array[$x] ?? 0, $batched_dispensed_array[$x] ?? 0, $batch_quantity_dispensed_array[$x] ?? 0, "treatments", $treatment_id, $patient_id); } } } /* ========= end of batch calculations ==== */ //Inserting patient dispensing $patient_dispensing = new PatientDispensing; $patient_dispensing->patient_id = $patient_id; $patient_dispensing->treatment_id = $treatment_id; $patient_dispensing->drugs = implode(',', $drug_ids_array); $patient_dispensing->dose = implode(',', $dose_array); $patient_dispensing->dose2 = implode(',', $dose_2_array); $patient_dispensing->drug_frequency = implode(',', $frequency_array); $patient_dispensing->duration = implode(',', $duration_array); $patient_dispensing->quantity_dispensed = implode(',', $quantity_to_dispense_array); $patient_dispensing->dispensed = 1; $patient_dispensing->instructions = implode(',', $instructions_to_patient_array); $patient_dispensing->tta = $to_take_away; $patient_dispensing->prescription_date = Carbon::now(); $patient_dispensing->pharmacy_comment = $comment; $patient_dispensing->purchased_elsewhere = implode(",", $purchased_elsewhere_array); $patient_dispensing->created_by = Auth::id(); $patient_dispensing->save(); $dispensing_id = $patient_dispensing->id; // get the last inserted ID //Updating the treatment table to show that the previous prescription was altered $treatment_model = Treatment::find($treatment_id); $treatment_model->dispense_status = 1; $treatment_model->purchased_elsewhere = implode(",", $purchased_elsewhere_array); /*====== save the current selling price now for those patients that will pay later when price has changed ====*/ $unit_selling_prices_array = []; $price_list_id = is_patient_category_attached_to_price_list($patient_id); for ($i=0; $i < count($drug_ids_array) ; $i++) { $drug_insurance_status = get_name($drug_ids_array[$i], "id", "insurance_coverage", "drugs"); if ($price_list_id) { $treatment_amount = get_price_list_category_price($price_list_id, 3, $drug_ids_array[$i]); if($drug_insurance_status == 1 && patient_insurance_status($patient_id) == 1){ $treatment_amount = get_chi_price_list_category_price($price_list_id, 3, $drug_ids_array[$i]); } } else { // check if drug and patient is eligible for insurance if($drug_insurance_status == 1 && patient_insurance_status($patient_id) == 1){ $treatment_amount = get_name($drug_ids_array[$i], "id", "insured_price", "drugs"); } else { $treatment_amount = get_name($drug_ids_array[$i], "id", "non_insured_price", "drugs"); } } $unit_selling_prices_array[] = $treatment_amount; } /* =============================================== */ $treatment_model->unit_selling_prices = implode(",", $unit_selling_prices_array); $treatment_model->save(); flash('Treatment dispensed successfully')->success(); return redirect('patient_dispensing_receipt/' . $dispensing_id); } public function edit_dispensing_details($patient_id, $treatment_id){ $treatment = Treatment::find($treatment_id); session()->put('alter_episode_id', $treatment->episode_id); session()->put('alter_patient_id', $patient_id); return redirect('/prescriptions/create'); } public function save_altered_prescription(Request $request){ $patient_id = $request->patient_id; $treatment_id = $request->treatment_id; $drug_ids_array = $request->drug_id; $quantity_to_dispense_array = $request->quantity_to_dispense; $dose_array = $request->dose; $dose_2_array = isset($request->dose2) ? $request->dose2 : []; $frequency_array = $request->frequency; $duration_array = $request->duration; $instructions_to_patient_array = $request->instructions; $prescribed_by = $request->prescribed_by; $to_take_away = $request->tta; $pharmacist = Auth::id(); $comment = $request->comment; $type_of_error = []; isset($request->wrong_dosage) ? $type_of_error[] = "Wrong dosage" : ""; isset($request->wrong_frequency) ? $type_of_error[] = "Wrong frequency" : ""; isset($request->inadequate_funds) ? $type_of_error[] = "Inadequate Funds" : ""; isset($request->other_error) ? $type_of_error[] = "Other error" : ""; $type_of_error = implode(',', $type_of_error); $severity_of_error = $request->severity_of_error; // update the drug stock levels for ($x = 0; $x < count($drug_ids_array); $x++) { $drug = Drug::find($drug_ids_array[$x]); $current_stock = $drug->pharmacy_stock; $new_stock = $current_stock - $quantity_to_dispense_array[$x]; $drug->pharmacy_stock = $new_stock; $drug->update(); } // inserting patient dispensing $patient_dispensing = new PatientDispensing; $patient_dispensing->patient_id = $patient_id; $patient_dispensing->treatment_id = $treatment_id; $patient_dispensing->drugs = implode(',', $drug_ids_array); $patient_dispensing->dose = implode(',', $dose_array); $patient_dispensing->dose2 = implode(',', $dose_2_array); $patient_dispensing->drug_frequency = implode(',', $frequency_array); $patient_dispensing->duration = implode(',', $duration_array); $patient_dispensing->quantity_dispensed = implode(',', $quantity_to_dispense_array); $patient_dispensing->dispensed = 1; $patient_dispensing->instructions = implode(',', $instructions_to_patient_array); $patient_dispensing->tta = $to_take_away; $patient_dispensing->prescription_date = Carbon::now(); $patient_dispensing->pharmacy_comment = $comment; $patient_dispensing->created_by = Auth::id(); $patient_dispensing->save(); $dispensing_id = $patient_dispensing->id; // updating the treatment table to show that the previous prescription was altered $treatment_model = Treatment::find($treatment_id); $treatment_model->altered = $patient_dispensing->id; $treatment_model->dispense_status = 1; $treatment_model->update(); // inserting the prescription errors $prescription_error = new PrescriptionError; $prescription_error->patient_id = $patient_id; $prescription_error->patient_dispensings_id = $dispensing_id; $prescription_error->type_of_error = $type_of_error; $prescription_error->severity_of_error = $severity_of_error; $prescription_error->prescriber = $prescribed_by; $prescription_error->pharmacist = Auth::id(); $prescription_error->created_by = Auth::id(); $prescription_error->comment = $comment; $prescription_error->save(); flash('Treatment altered and dispensed successfully')->success(); return redirect('patient_dispensing_receipt/' . $dispensing_id); } /* function for ward dispensing */ public function ward_dispensing(Request $request) { $drugs = DB::table('drugs')->where('available', 1)->whereNull('deleted_at')->orderBy('name')->pluck('name', 'id'); $wards = DB::table('wards')->where('available', 1)->whereNull('deleted_at')->orderBy('name')->pluck('name', 'id')->toArray(); $wards = ['' => '- select -'] + $wards; $staff_array = $this->userService->pluckUserFullName(); if (isset($request->drugs_to_dispense)) { $selected_drugs_array = $request->drugs_to_dispense; $drugs_to_dispense_collection = Drug::whereIn('id', $selected_drugs_array)->get(); return view('pharmacy::pharmacy.ward_dispensing', compact('drugs', 'wards', 'drugs_to_dispense_collection', 'staff_array')); } return view('pharmacy::pharmacy.ward_dispensing', compact('drugs', 'wards', 'staff_array')); } // view past ward dispensing details public function view_ward_dispensing(Request $request){ $wards = Ward::orderBy('name')->pluck('name', 'id')->toArray(); $wards = ['' => '- select -'] + $wards; if (isset($request->ward)){ $search_complete = true; $ward_id = $request->ward; $start_date = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::parse($request->end_date)->endOfDay()->toDateTimeString(); $ward_dispensing = WardDispensing::where('ward_id', $ward_id) ->whereBetween('created_at', [$start_date, $end_date]) ->paginate(50); return view('pharmacy::pharmacy.view_ward_dispensing', compact('wards', 'search_complete', 'ward_id', 'start_date', 'end_date', 'ward_dispensing')); } else { $search_complete = false; return view('pharmacy::pharmacy.view_ward_dispensing', compact('wards', 'search_complete')); } } /* view pharmacy stock sheet */ public function stock_sheet() { $drugs = DB::table('drugs')->where('available', 1)->whereNull('deleted_at')->orderBy('name', 'asc')->get(); if (count($drugs) < 1) { flash()->error("There is out of stock of drugs"); return redirect('/drugs/'); } else { return view('pharmacy::pharmacy.stock_sheet', compact('drugs')); } } /* patient dispensing receipt */ public function patient_dispensing_receipt($dispensing_id) { $patient_dispensing = PatientDispensing::find($dispensing_id); session()->put('patient_id', $patient_dispensing->patient_id); $episode_id = PatientEpisode::where([['patient_id', $patient_dispensing->patient_id],['treatment_id', $patient_dispensing->treatment_id]])->first(['id']); $hospital_details = HospitalInformation::find(1); return view('pharmacy::pharmacy.patient_dispensing_receipt', compact('patient_dispensing', 'hospital_details', 'episode_id')); } /* requisition for drugs */ public function requisition_for_drugs(Request $request) { $quotation_type_options = DB::table('quotation_types')->pluck('name', 'id')->toArray(); $quotation_type_options = ['' => '- Select Requistion Type -'] + $quotation_type_options; $results = []; $item_type = 0; $names_array = []; if (isset($request->quotation_type)) { $item_type = $request->quotation_type; //1-drug 2-sundry 3-dental 4-radiology 5-Lab if ($item_type == 1) { $names_array = DB::table('drugs')->where('available', 1)->orderBy('name')->whereNull('deleted_at')->pluck('name','id')->prepend('All Drugs', 'all_items'); } elseif ($item_type == 2) { $names_array = DB::table('sundries')->where('available', 1)->orderBy('name')->whereNull('deleted_at')->pluck('name','id')->prepend('All Sundries', 'all_items'); } elseif ($item_type == 3) { $names_array = DB::table('dentals')->orderBy('name')->whereNull('deleted_at')->pluck('name','id')->prepend('All Dentals', 'all_items'); } elseif ($item_type == 4) { $names_array = DB::table('radiologies')->orderBy('name')->whereNull('deleted_at')->pluck('name','id')->prepend('All Radiology Items', 'all_items'); } elseif ($item_type == 5) { $names_array = DB::table('labs')->orderBy('name')->whereNull('deleted_at')->pluck('name','id')->prepend('All Labs', 'all_items'); } elseif ($item_type == 6) { $names_array = DB::table('general_items')->orderBy('name')->whereNull('deleted_at')->pluck('name','id')->prepend('All General Items', 'all_items'); } elseif ($item_type == 7) { $names_array = DB::table('eye_glasses')->orderBy('name')->whereNull('deleted_at')->pluck('name','id')->prepend('All Optical Items', 'all_items'); } } return view('pharmacy::pharmacy.requisition_for_drugs', compact('quotation_type_options', 'results', 'item_type','names_array')); } /* handle the search from drug requisitions */ public function drug_requisition_search(Request $request) { $quotation_type_options = DB::table('quotation_types')->pluck('name', 'id')->toArray(); $quotation_type_options = ['' => '- Select Requistion Type -'] + $quotation_type_options; $results = null; $item_type = $request->item_type; $item_ids_array = $request->drug_name; $names_array = []; if (isset($request->item_type)) { if ($item_type == 1) { $results = (in_array("all_items", $item_ids_array))? Drug::where('available', 1)->orderby('name', 'asc')->get() :Drug::whereIn('id', $item_ids_array)->where('available', 1)->orderBy('name','asc')->get(); $names_array = Drug::where('available', 1)->orderby('name')->distinct()->pluck('name','id'); } elseif ($item_type == 2) { $results = (in_array("all_items", $item_ids_array))? Sundry::where('available', 1)->orderBy('name','asc')->get() :Sundry::whereIn('id', $item_ids_array)->where('available', 1)->orderBy('name','asc')->get(); $names_array = Sundry::where('available', 1)->orderby('name')->distinct()->pluck('name','id'); } elseif ($item_type == 3) { $results = (in_array("all_items", $item_ids_array))? Dental::orderBy('name','asc')->get() :Dental::whereIn('id', $item_ids_array)->orderBy('name','asc')->get(); $names_array = Dental::orderBy('name')->distinct()->pluck('name','id'); } elseif ($item_type == 4) { $results = (in_array("all_items", $item_ids_array))? Radiology::orderBy('name','asc')->get():Radiology::whereIn('id', $item_ids_array)->orderBy('name','asc')->get(); $names_array = Radiology::orderBy('name')->distinct()->pluck('name','id'); } elseif ($item_type == 5) { $results = (in_array("all_items", $item_ids_array))? Lab::orderBy('name','asc')->get() : Lab::whereIn('id', $item_ids_array)->orderBy('name','asc')->get(); $names_array = Lab::orderBy('name')->distinct()->pluck('name','id'); } elseif ($item_type == 6) { $results = (in_array("all_items", $item_ids_array))? GeneralItem::orderBy('name','asc')->get() : GeneralItem::whereIn('id', $item_ids_array)->orderBy('name','asc')->get(); $names_array = GeneralItem::orderBy('name')->distinct()->pluck('name','id'); } elseif ($item_type == 7) { $results =(in_array("all_items", $item_ids_array))? EyeGlasses::orderBy('name','asc')->get(): EyeGlasses::whereIn('id', $item_ids_array)->orderBy('name','asc')->get(); $names_array = EyeGlasses::orderBy('name')->distinct()->pluck('name','id'); } } return view('pharmacy::pharmacy.requisition_for_drugs', compact('quotation_type_options', 'results', 'item_type','names_array')); } /* store requisitions */ public function store_requisition(Request $request) { $drug_id_array = $request->drug_id; $quantity_array = $request->quantity; $item_type = $request->item_type; $user_id = Auth::id(); /* return back if no quantity has been filled */ if (array_sum($quantity_array) < 1) { flash('Please insert some values!')->error(); return redirect()->back(); } if (isset($request->save_for_later)) { // insert into temporary requisitions table $temporary_requisition = new TemporaryRequisition; $temporary_requisition->quotation_type_id = $item_type; $temporary_requisition->drug_id = implode(',', $drug_id_array); $temporary_requisition->quantity_requested = implode(',', $quantity_array); $temporary_requisition->created_by = $user_id; if ($temporary_requisition->save()) { flash('Requisition has been saved for later')->success(); return redirect('select_temporary_requisition'); } return redirect()->back(); } elseif (isset($request->complete_request)) { /* 1.insert into the requisitions table 2.if it was a previously temporary requisition, do step 1(insert into requisitions) and update completion_status in the temporary table to 1 */ $filtered_drugs_array = []; $filtered_quantities_array = []; $associative_requested_drugs_array = []; for ($i=0; $i < count($drug_id_array) ; $i++) { if ($quantity_array[$i] != "") { $associative_requested_drugs_array[$drug_id_array[$i]] = $quantity_array[$i]; $filtered_drugs_array[] = $drug_id_array[$i]; $filtered_quantities_array[] = $quantity_array[$i]; } } $new_requisition = new Requisition; $new_requisition->quotation_type_id = $item_type; $new_requisition->drug_id = implode(',', $filtered_drugs_array); $new_requisition->quantity_requested = implode(',', $filtered_quantities_array); $new_requisition->created_by = $user_id; $new_requisition->save(); flash('Requisition number ' . $new_requisition->id . ' made successfully')->success(); return redirect('/print_requisition_receipt/' . $new_requisition->id); } elseif (isset($request->complete_previously_temporary_requisition)) { $temporary_requisition_model = TemporaryRequisition::find($request->temporary_requisition_id); $temporary_requisition_model->completion_status = 1; $temporary_requisition_model->updated_by = $user_id; $temporary_requisition_model->update(); $requisition_model = new Requisition; $requisition_model->quotation_type_id = $temporary_requisition_model->quotation_type_id; $requisition_model->drug_id = implode(',', $drug_id_array); $requisition_model->quantity_requested = implode(',', $quantity_array); $requisition_model->created_by = $user_id; $requisition_model->save(); return redirect('/print_requisition_receipt/' . $requisition_model->id); } elseif (isset($request->update_temporary_requisition)) { $temporary_requisition_model = TemporaryRequisition::find($request->temporary_requisition_id); $temporary_requisition_model->drug_id = implode(',', $drug_id_array); $temporary_requisition_model->quantity_requested = implode(',', $quantity_array); $temporary_requisition_model->updated_by = $user_id; $temporary_requisition_model->update(); flash('Requisition updated successfully')->success(); return redirect('previous_drug_requisitions'); } else { flash('Please search for items')->error(); return redirect()->back(); } } /* select and view temporary requisitions */ public function select_temporary_requisition(Request $request) { $quotation_type_options = DB::table('quotation_types')->pluck('name', 'id')->toArray(); $quotation_type_options = ['' => '- Select Requisition type -'] + $quotation_type_options; $results = 0; $quotation_type = 0; if (isset($request->quotation_type)) { $quotation_type = $request->quotation_type; //1-drug 2-sundry 3-dental 4-radiology 5-Lab $results = TemporaryRequisition::where(['quotation_type_id' => $quotation_type, 'completion_status' => 0])->orderBy('id', 'desc')->get(); } return view('pharmacy::pharmacy.select_temporary_requisitions', compact('quotation_type_options', 'results', 'quotation_type')); } /* edit temporary requisition */ public function edit_temporary_requisition(Request $request) { $quotation_type = $request->item_type; $requisition_id = $request->requisition_id; $suppliers = DB::table('suppliers')->where('available', 1)->whereNull('deleted_at')->orderBy('name')->pluck('name', 'id')->toArray(); $suppliers = ['' => '- select -'] + $suppliers; $requisition_results = TemporaryRequisition::where(['id' => $requisition_id, 'completion_status' => 0])->orderBy('id', 'desc')->get(); //1-drug 2-sundry 3-dental 4-radiology 5-Lab if ($quotation_type == 1) { $items = Drug::where('available', 1)->orderby('name', 'asc')->get(); } elseif ($quotation_type == 2) { $items = Sundry::where('available', 1)->orderby('name', 'asc')->get(); } elseif ($quotation_type == 3) { $items = Dental::orderBy('name', 'asc')->get(); } elseif ($quotation_type == 4) { $items = Radiology::orderBy('name', 'asc')->get(); } elseif ($quotation_type == 5) { $items = Lab::orderBy('name', 'asc')->get(); } return view('pharmacy::pharmacy.edit_temporary_requisition', compact('items', 'quotation_type', 'suppliers', 'requisition_id', 'requisition_results')); } /* view previous drug quotations */ public function previous_drug_requisitions(Request $request) { $quotation_type_options = DB::table('quotation_types')->pluck('name', 'id')->toArray(); $quotation_type_options = ['' => '- Select Requisition type -'] + $quotation_type_options; $results = []; $item_type = ""; $display = ""; if(isset($request->start_date) && isset($request->end_date)){ if (isset($request->quotation_type)) { $start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->toDateString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->toDateString(); $start_date = Carbon::parse($start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::parse($end_date)->endOfDay()->toDateTimeString(); $results = Requisition::whereBetween('created_at',[$start_date, $end_date])->where('quotation_type_id',$request->quotation_type)->orderBy('id','desc')->get(); } } return view('pharmacy::pharmacy.previous_requisitions', compact('quotation_type_options','results','item_type','display')); } /* edit a previous requisition */ public function edit_previous_requisition(Request $request) { $requisition_id = $request->requisition_id; $item_type = $request->item_type; $results = DB::select("SELECT * FROM requisitions where id = {$requisition_id}"); if ($item_type == 4 ||$item_type == 5 ) { $results = get_requisition_all_batches($results,['store_stock','lab_stock'],['store_batches','lab_batches'],['total_store_stock','total_lab_stock'],$item_type); }else{ //if source is from labs for sundries if ($item_type==2 && $results[0]->requisition_origin == 2){ $results = get_all_batch_details($results,['store_stock','lab_stock'],['store_batches','lab_batches'],['total_store_stock','total_lab_stock'],$item_type); } // if source is from imaging for sundries elseif ($item_type==2 && $results[0]->requisition_origin == 3){ $results = get_all_batch_details($results,['store_stock','radiology_stock'],['store_batches','imaging_batches'],['total_store_stock','total_imaging_stock'],$item_type); } else $results = get_all_batch_details($results,['store_stock','pharmacy_stock'],['store_batches','pharmacy_batches'],['total_store_stock','total_pharmacy_stock'],$item_type); } return view('pharmacy::pharmacy.edit_previous_requisition', compact('requisition_id', 'item_type', 'results')); } /* function to update edited previous requisition */ public function update_previous_requisition(Request $request) { $requisition_id = $request->requisition_id; $quantity_requested_string = implode(',', $request->quantity_requested); $drugs_string = implode(',', $request->drug_id); $units_string = implode(',', $request->units); $requisition_model = Requisition::find(intval($requisition_id)); if($requisition_model != null){ //$requisition_model->drug_id = $drugs_string; $requisition_model->quantity_requested = $quantity_requested_string; if ($requisition_model->update()) { flash('Requisition has been updated')->success(); return redirect('/print_requisition_receipt/' . $requisition_id); } } flash('Error occured while trying to update')->error(); return redirect()->back(); } /* pharmacy sundries stock sheet */ public function sundries_stock_sheet() { $sundries = DB::table('sundries')->whereNull('deleted_at')->orderBy('name', 'asc')->get(); if (empty($sundries)) { flash()->error("There is out of stock of sundries"); return redirect('/sundries/'); } else { return view('pharmacy::pharmacy.sundries_stock_sheet', compact('sundries')); } } /* update the sundries stock sheet */ public function update_sundries_stock_sheet(Request $request) { $sundry_ids = $request->sundry_id; $quantity = $request->quantity; for ($x = 0; $x < count($sundry_ids); $x++): $sundry = Sundry::find($sundry_ids[$x]); $sundry->pharmacy_stock = $quantity[$x]; $update_store_stock = $sundry->update(); endfor; if ($update_store_stock): flash('Pharmacy Stock Levels Updated')->success(); return redirect('pharmacy_sundries_stock_sheet'); endif; flash('Sorry, unable to update stock')->error(); return redirect()->back(); } public function print_requisition_receipt($id) { $requisition_model = Requisition::find($id); $hospital_details = HospitalInformation::find(1); $requisition_id = $id; return view('pharmacy::pharmacy.requisition_receipt', compact('hospital_details', 'requisition_id', 'requisition_model')); } /* list all unconfirmed prescriptions */ public function confirm_prescriptions(Request $request) { $search_text = ""; $filters = []; if (isset($request->patient_id) && $request->patient_id != 0) { array_push($filters, ['patient_id', '=', $request->patient_id]); $search_text = "Showing results for " . get_full_name($request->patient_id, 'id', 'first_name', 'last_name', 'patients') . " (" . get_name($request->patient_id, 'id', 'number', 'patients') . ")"; } elseif($request->search_by == 0){ // last 24 hours array_push($filters, ['created_at', '>', Carbon::now()->subDay()]); $search_text = "Showing prescriptions in the past 24 hours"; } elseif($request->search_by == 1){ // custom date $start_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); $search_text = "Showing prescriptions made between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } elseif($request->search_by == 2){ // custom date range $start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); $search_text = "Showing prescriptions made between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } else { // last 24 hours array_push($filters, ['created_at', '>', Carbon::now()->subDay()]); $search_text = "Showing prescriptions in the past 24 hours"; } $unconfirmed_prescriptions = Treatment::where(['dispense_status' => 0]) ->where(['confirmation_status' => 0]) ->where($filters) ->orderBy('created_at', 'desc') ->get(); $confirmed_prescriptions = Treatment::where(['dispense_status' => 0]) ->where(['confirmation_status' => 1]) ->where(['payment_status' => 0]) ->where($filters) ->orderBy('created_at', 'desc') ->get(); $categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id"); return view('pharmacy::pharmacy.incoming_unconfirmed_prescriptions', compact('confirmed_prescriptions','unconfirmed_prescriptions', 'categories')); } public function confirm_dispensing_details(Request $request) { $treatment_id = $request->treatment_id; $patient_id = $request->patient_id; $episode_id = $request->episode_id; $patient = Patient::where(['id' => $patient_id])->first(); $treatment = Treatment::find($treatment_id); $previous_treatments = Treatment::where('patient_id',$patient_id)->where('episode_id', '!=', $episode_id)->take(5)->get(); return view('pharmacy::pharmacy.confirm_dispensation_details', compact('patient_id', 'treatment_id', 'patient', 'treatment', 'previous_treatments')); } public function store_prescription_confirmation(Request $request) { $purchased_elsewhere = $request->purchased_elsewhere; $treatment = Treatment::find($request->treatment_id); $purchased_elsewhere_array = []; $drugs = explode(",", $treatment->drugs); if (!is_null($purchased_elsewhere) && count($purchased_elsewhere) > 0) { foreach ($drugs as $drug) { if (in_array($drug, $purchased_elsewhere)) { $purchased_elsewhere_array[] = 1; } else { $purchased_elsewhere_array[] = 0; } } } else { $purchased_elsewhere_array = array_fill(0, count($drugs), 0); } $treatment->confirmation_status = 1; $treatment->purchased_elsewhere = implode(",", $purchased_elsewhere_array); $treatment->update(); flash('Treatment has been confirmed')->success(); return redirect('confirm_prescriptions'); } public function alter_dispensing_details(Request $request){ $treatment_id = $request->treatment_id; $patient_id = $request->patient_id; if (isset($request->alter)) { $patient = Patient::where(['id' => $patient_id])->first(); $categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id"); $marital_statuses = DB::table('marital_statuses')->pluck("name", "id"); $drug_categories = DB::table('drug_categories')->get(); $treatment = Treatment::find($treatment_id); $patient_dispensings = PatientDispensing::where(['treatment_id' => $treatment_id])->get(); $dispensed_drugs_array = []; //This is to handle altering a treatment where some of the drugs have been dispensed if (count($patient_dispensings) > 0) { foreach ($patient_dispensings as $patient_dispensing) { $dispensed_drugs_array_exploded = explode(",", $patient_dispensing->drugs); $dispensed_drugs_array = array_merge($dispensed_drugs_array, $dispensed_drugs_array_exploded); } } $dosage_frequencies = DB::table('dosage_frequencies')->pluck("name", "id")->toArray(); $drug_options = DB::table('drugs')->where('available', 1)->pluck("name", "id")->toArray(); /* make frequencies drop down that will be used by ajax to dynamically add another prescription */ $frequencyDropDown = ''; $frequencyDropDown .= ''; $frequencies = DosageFrequency::orderBy('name', 'asc')->get(); foreach ($frequencies as $frequency) { $frequencyDropDown .= ''; } /* make drugs drop down that will be used by ajax to dynamically add another prescription */ $drugsDropDown = ''; $drugsDropDown .= ''; $drugs_drop_down = Drug::where('available', 1)->orderby('name', 'asc')->get(); foreach ($drugs_drop_down as $drop_down) { if ($drop_down->insurance_coverage == 1) { $drugsDropDown .= ''; } else { $drugsDropDown .= ''; } } $known_patient_allergies = Allergy::where('patient_id', $patient_id)->orderBy('created_at', 'desc')->take(2)->get(); $known_patient_alerts = Alert::where('patient_id',$patient_id)->orderBy('created_at', 'desc')->take(2)->get(); $drug_categories_array = DB::table('drug_categories')->pluck('name', 'id'); return view('pharmacy::pharmacy.edit_dispensing_details', compact('patient_id', 'treatment_id', 'patient', 'categories', 'marital_statuses', 'drug_categories', 'treatment', 'dosage_frequencies', 'drug_options', 'frequencyDropDown', 'drugsDropDown', 'known_patient_alerts', 'known_patient_allergies','dispensed_drugs_array', 'drug_categories_array')); } $drug_ids_array = $request->drug_id; $quantity_to_dispense_array = $request->quantity_to_dispense; $dose_array = $request->dose; $dose_2_array = isset($request->dose2) ? $request->dose2 : []; $frequency_array = $request->frequency; $duration_array = $request->duration; $instructions_to_patient_array = $request->instructions; $prescribed_by = $request->prescribed_by; $to_take_away = $request->tta; $pharmacist = Auth::id(); $comment = $request->comment; $type_of_error = []; isset($request->wrong_dosage) ? $type_of_error[] = "Wrong dosage" : ""; isset($request->wrong_frequency) ? $type_of_error[] = "Wrong frequency" : ""; isset($request->inadequate_funds) ? $type_of_error[] = "Inadequate Funds" : ""; isset($request->other_error) ? $type_of_error[] = "Other error" : ""; $type_of_error = implode(',', $type_of_error); $severity_of_error = $request->severity_of_error; /* 1.reduce pharmacy_stock of that drug that's been dispensed 2.insert into patient_dispensing 3.insert into prescription error if there is one 4.update treatment and set dispense status to 1 where id = treatment_id. 5.issue patient dispensed receipt */ //$dispensing_id = $patient_dispensing->id; // get the last inserted ID //inserting the prescription errors $treatment_record = Treatment::find($treatment_id); if (isset($request->severity_of_error) && !is_null($request->severity_of_error)) { $prescription_error = new PrescriptionError; $prescription_error->patient_id = $patient_id; $prescription_error->patient_dispensings_id = 0; //$dispensing_id; update the dispensing id when dispensed $prescription_error->type_of_error = $type_of_error; $prescription_error->severity_of_error = $severity_of_error; $prescription_error->prescriber = $prescribed_by; $prescription_error->pharmacist = Auth::id(); $prescription_error->created_by = Auth::id(); $prescription_error->comment = $comment; $prescription_error->episode_id = $treatment_record->episode_id; $prescription_error->save(); //update the treatments table if anything has been added or subtracted $treatment_record->drugs = implode(",", $request->drug_id); $treatment_record->doses = implode(",", $request->dose); $treatment_record->dose2 = implode(",", $request->dose_two); $treatment_record->frequencies = implode(",", $request->frequency); $treatment_record->durations = implode(",", $request->duration); $treatment_record->quantities_dispensed = implode(",", $request->quantity_to_dispense); $treatment_record->instruction = implode(",", $request->instructions); $treatment_record->update(); } //Updating the treatment table to show that the previous prescription was altered $treatment_model = Treatment::find($treatment_id); $treatment_model->altered = 0; //$dispensing_id; update with the dispensing id when dispensed $treatment_model->confirmation_status = 1; $update_treatment_alter = $treatment_model->update(); flash('Treatment has been Updated')->success(); return redirect('confirm_prescriptions'); } public function check_if_prescription_had_error($patient_id, $episode_id) { $prescription_errors = PrescriptionError::where(['patient_id' => $patient_id, 'episode_id' => $episode_id])->get(); $status = null; if (count($prescription_errors) > 0) { foreach ($prescription_errors as $error_record) { $status = $error_record->id; } } return $status; } /* ward dispensing per chart */ public function ward_dispensing_per_chart(Request $request) { $wards = DB::table('wards')->where('available', 1)->orderBy('name')->pluck("name", "id")->toArray(); $wards = ['0' => 'All wards'] + $wards; $search_by = $request->search_by; $drugs = Drug::where('available', 1)->orderBy('name')->pluck('name', 'id')->prepend('-- Select Drug --', '')->toArray(); $drugs_dropdown = ""; foreach ($drugs as $id => $name) { $this_drug_name = str_replace("'", '', $name); $this_drug_name = str_replace("\"", '', $this_drug_name); $drugs_dropdown .= ''; } $cancer_protocols = CancerProtocol::pluck('name', 'id'); $search_text = 0; if (isset($request->patient_id) && $request->patient_id != 0) { $inpatients = InpatientInfo::where(['discharged' => 0]) ->where('patient_id', $request->patient_id) ->orderBy('created_at', 'desc') ->get(); $search_text = "Showing results for " . get_full_name($request->patient_id, 'id', 'first_name', 'last_name', 'patients') . " (" . get_name($request->patient_id, 'id', 'number', 'patients') . ")"; $ward_id = 0; } elseif (isset($request->ward_id)) { $ward_id = $request->ward_id; $inpatients = []; $filters = []; $start_date = ""; $end_date = ""; if($request->search_by == 0){ // last 24 hours $last_day = Carbon::now()->subDay(); array_push($filters, ['created_at', '>', $last_day]); } elseif($request->search_by == 1){ // custom date $start_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); } elseif($request->search_by == 2){ // custom date range $start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); } elseif($request->search_by == 3){ // } if (!empty($ward_id) && $ward_id != 0) { if($request->search_by == 0){ $search_text = "Showing patients admitted to " . get_name($ward_id, 'id', 'name', 'wards') . "in last 24 hours"; } else { $search_text = "Showing patients admitted to " . get_name($ward_id, 'id', 'name', 'wards') . " between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } $inpatients = InpatientInfo::where(['ward_id' => $ward_id, 'discharged' => 0])->where($filters)->orderBy('created_at', 'desc')->get(); } else { if($request->search_by == 0){ $search_text = "Showing patients admitted in the past 24 hours"; } else { $search_text = "Showing patients admitted between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } $inpatients = InpatientInfo::where(['discharged' => 0])->where($filters)->orderBy('created_at', 'desc')->get(); } } else { $inpatients = []; $ward_id = 0; } return view('pharmacy::pharmacy.ward_dispensing_per_chart', compact('inpatients', 'wards', 'ward_id', 'search_by', 'drugs', 'search_text', 'drugs_dropdown', 'cancer_protocols')); } public function store_ward_dispensing_per_chart(Request $request) { //store in the ward_dipensings_per_charts table but also store in the ward_treatment_dispensations table so that they are billable on individual patient inpatient sheet/bill $dipensed_drugs_array = $request->dispensed_drugs ?? []; $quantity_dispensed_array = $request->quantity_dispensed; $patient_ids_array = $request->patient_id; $episode_ids_array = $request->episode_id; $inpatient_info_ids_array = $request->inpatient_info_id; $ward_ids_array = $request->ward_id; $clean_patient_id_array = []; $clean_episode_id_array = []; $clean_inpatient_info_id_array = []; $clean_ward_id_array = []; $clean_drug_id_array = []; $clean_quantity_given_array = []; $cancer_protocol_ids = []; $cancer_protocol_ward_charts = []; if (isset($request->request_comment_patient_id)) { // logic for the cancer protocol $request_comment_patient_id_arr = $request->request_comment_patient_id; $request_comment_episode_id_arr = $request->request_comment_episode_id; $request_comment_protocol_id_arr = $request->request_comment_protocol_id; $protocol_weight_arr = $request->protocol_weight; $protocol_height_arr = $request->protocol_height; $protocol_vitals_date_taken_arr = $request->protocol_vitals_date_taken; $protocol_ward_id_arr = $request->protocol_ward_id; $protocol_id_arr = $request->protocol_id; $request_comment_arr = $request->request_comment; for ($i = 0; $i < count($request_comment_arr); $i++) { $cancer_protocol_ward_charts[$request_comment_patient_id_arr[$i] . '_' . $request_comment_episode_id_arr[$i] . '_' . $request_comment_protocol_id_arr[$i]]['request_comment'] = $request_comment_arr[$i]; $cancer_protocol_ward_charts[$request_comment_patient_id_arr[$i] . '_' . $request_comment_episode_id_arr[$i] . '_' . $request_comment_protocol_id_arr[$i]]['protocol_weight'] = $protocol_weight_arr[$i]; $cancer_protocol_ward_charts[$request_comment_patient_id_arr[$i] . '_' . $request_comment_episode_id_arr[$i] . '_' . $request_comment_protocol_id_arr[$i]]['protocol_height'] = $protocol_height_arr[$i]; $cancer_protocol_ward_charts[$request_comment_patient_id_arr[$i] . '_' . $request_comment_episode_id_arr[$i] . '_' . $request_comment_protocol_id_arr[$i]]['protocol_vitals_date_taken'] = $protocol_vitals_date_taken_arr[$i]; $cancer_protocol_ward_charts[$request_comment_patient_id_arr[$i] . '_' . $request_comment_episode_id_arr[$i] . '_' . $request_comment_protocol_id_arr[$i]]['protocol_ward_id'] = $protocol_ward_id_arr[$i]; } $protocol_drug_id_arr = $request->protocol_drug_id; $protocol_section_arr = $request->protocol_section; $protocol_drug_factor_arr = $request->protocol_drug_factor; $protocol_drug_factor_value_arr = $request->protocol_drug_factor_value; $protocol_drug_dose_arr = $request->protocol_drug_dose; $protocol_drug_dosage_label_arr = $request->protocol_drug_dosage_label; $protocol_drug_unit_value_arr = $request->protocol_drug_unit_value; $protocol_dosage_to_dispense_arr = $request->protocol_dosage_to_dispense; $protocol_quantity_to_dispense_arr = $request->protocol_quantity_to_dispense; $protocol_is_drug_selected_arr = $request->protocol_is_drug_selected; $protocol_instruction_arr = $request->protocol_instruction; $protocol_patient_id_arr = $request->protocol_patient_id; $protocol_episode_id_arr = $request->protocol_episode_id; for ($i = 0; $i < count($protocol_drug_id_arr); $i++) { if ($protocol_is_drug_selected_arr[$i] == 1) { $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_section"][] = $protocol_section_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_drug_id"][] = $protocol_drug_id_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_drug_factor"][] = $protocol_drug_factor_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_drug_factor_value"][] = $protocol_drug_factor_value_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_drug_dose"][] = $protocol_drug_dose_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_drug_dosage_label"][] = $protocol_drug_dosage_label_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_drug_unit_value"][] = $protocol_drug_unit_value_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_dosage_to_dispense"][] = $protocol_dosage_to_dispense_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_quantity_to_dispense"][] = $protocol_quantity_to_dispense_arr[$i]; $cancer_protocol_ward_charts[$protocol_patient_id_arr[$i] . '_' . $protocol_episode_id_arr[$i] . '_' . $protocol_id_arr[$i]]["protocol_instruction"][] = $protocol_instruction_arr[$i]; } } foreach ($cancer_protocol_ward_charts as $key => $values) { $exploded_key = explode("_", $key); if (count($values) == 5) { // none of the drugs were ticked continue; } $cancer_protocol_ward_chart = new CancerProtocolWardChart(); $cancer_protocol_ward_chart->patient_id = $exploded_key[0]; $cancer_protocol_ward_chart->episode_id = $exploded_key[1]; $cancer_protocol_ward_chart->ward_id = $values['protocol_ward_id']; $cancer_protocol_ward_chart->height = $values['protocol_height']; $cancer_protocol_ward_chart->weight = $values['protocol_weight']; $cancer_protocol_ward_chart->vitals_date_taken = $values['protocol_vitals_date_taken']; $cancer_protocol_ward_chart->request_comment = $values['request_comment']; $cancer_protocol_ward_chart->protocol_id = $exploded_key[2]; $cancer_protocol_ward_chart->protocol_drug_id = implode(',', $values['protocol_drug_id']); $cancer_protocol_ward_chart->protocol_section = implode(',', $values['protocol_section']); $cancer_protocol_ward_chart->protocol_drug_factor = implode(',', $values['protocol_drug_factor']); $cancer_protocol_ward_chart->protocol_drug_factor_value = implode(',', $values['protocol_drug_factor_value']); $cancer_protocol_ward_chart->protocol_drug_dose = implode(',', $values['protocol_drug_dose']); $cancer_protocol_ward_chart->protocol_drug_dosage_label = implode(',', $values['protocol_drug_dosage_label']); $cancer_protocol_ward_chart->protocol_drug_unit_value = implode(',', $values['protocol_drug_unit_value']); $cancer_protocol_ward_chart->protocol_dosage_to_dispense = implode(',', $values['protocol_dosage_to_dispense']); $cancer_protocol_ward_chart->protocol_quantity_to_dispense = implode(',', $values['protocol_quantity_to_dispense']); $cancer_protocol_ward_chart->protocol_instruction = json_encode($values['protocol_instruction']); $cancer_protocol_ward_chart->created_by = Auth::id(); $cancer_protocol_ward_chart->save(); $cancer_protocol_ids[] = $cancer_protocol_ward_chart->id; } } for ($i=0; $i < count($dipensed_drugs_array) ; $i++) { if (!is_null($dipensed_drugs_array[$i]) && !is_null($quantity_dispensed_array[$i])) { $clean_patient_id_array[] = $patient_ids_array[$i]; $clean_episode_id_array[] = $episode_ids_array[$i]; $clean_inpatient_info_id_array[] = $inpatient_info_ids_array[$i]; $clean_ward_id_array[] = $ward_ids_array[$i]; $clean_drug_id_array[] = $dipensed_drugs_array[$i]; $clean_quantity_given_array[] = $quantity_dispensed_array[$i]; } } $incoming_ward_chart = new IncomingWardChart; $incoming_ward_chart->patient_ids = implode(",", $clean_patient_id_array); $incoming_ward_chart->episode_ids = implode(",", $clean_episode_id_array); $incoming_ward_chart->inpatient_info_ids = implode(",", $clean_inpatient_info_id_array); $incoming_ward_chart->drug_ids = implode(",", $clean_drug_id_array); $incoming_ward_chart->quantity_given = implode(",", $clean_quantity_given_array); $incoming_ward_chart->ward_ids = implode(",", $clean_ward_id_array); $incoming_ward_chart->chart_ward_id = $request->chart_ward_id; $incoming_ward_chart->created_by = Auth::id(); $incoming_ward_chart->has_cancer_protocol = (count($cancer_protocol_ids) > 0) ? implode(",", $cancer_protocol_ids) : NULL; $incoming_ward_chart->save(); flash('Patient charts have been saved')->success(); return redirect('incoming_ward_charts'); } public function incoming_ward_charts(Request $request) { $ward_id = $request->ward_id; $filters = []; $start_date = null; $end_date = null; if($request->search_by == 0){ // last 24 hours $last_day = Carbon::now()->subDay(); $filters[] = ['created_at', '>', $last_day]; } elseif($request->search_by == 1){ // custom date $start_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->endOfDay()->toDateTimeString(); $filters[] = ['created_at', '>', $start_date]; $filters[] = ['created_at', '<', $end_date]; } elseif($request->search_by == 2){ // custom date range $start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->endOfDay()->toDateTimeString(); $filters[] = ['created_at', '>', $start_date]; $filters[] = ['created_at', '<', $end_date]; } $search_by = $request->search_by; if (!empty($ward_id) && $ward_id != 0) { $incoming_charts = IncomingWardChart::where(['chart_ward_id' => $ward_id, 'completion_status' => 0])->where($filters)->get(); } else { $incoming_charts = IncomingWardChart::where(['completion_status' => 0])->where($filters)->get(); } $staff_array = $this->userService->pluckUserFullName(); $wards = DB::table('wards')->where('available', 1)->orderBy('name')->pluck("name", "id")->toArray(); $wards = ['0' => 'All wards'] + $wards; return view('pharmacy::pharmacy.incoming_ward_chart',compact('staff_array', 'wards', 'ward_id', 'search_by','start_date','end_date', 'incoming_charts')); } public function approve_ward_dispensing_per_chart($incoming_ward_chart_id) { $search_by = null; $cancer_protocol_orders = false; $incoming_chart_record = IncomingWardChart::find($incoming_ward_chart_id); $ward_id = $incoming_chart_record->chart_ward_id; if (!is_null($incoming_chart_record)) { $drug_ids_array = explode(",", $incoming_chart_record->drug_ids); $quantity_given_array = explode(",", $incoming_chart_record->quantity_given); if (!is_null($incoming_chart_record->has_cancer_protocol)) { $cancer_protocol_ids = explode(",", $incoming_chart_record->has_cancer_protocol); $cancer_protocol_orders = CancerProtocolWardChart::whereIn('id', $cancer_protocol_ids)->get(); } } $drugs_to_dispense_array = []; $quantities_to_dispense_array = []; for ($i = 0; $i < count($drug_ids_array); $i++) { // check if a drug id already exists in the drugs array if (in_array($drug_ids_array[$i], $drugs_to_dispense_array)) { //get key of that drug which exists $key = array_search($drug_ids_array[$i], $drugs_to_dispense_array); //increment the "to_dispense_qty" value of drug $quantities_to_dispense_array[$key] += $quantity_given_array[$i]; } else { //drugs does not exist, create new entry $drugs_to_dispense_array[] = $drug_ids_array[$i]; $quantities_to_dispense_array[] = $quantity_given_array[$i]; } } $wards = DB::table('wards')->where('available', 1)->orderBy('name')->pluck("name", "id")->toArray(); $wards = ['0' => 'All wards'] + $wards; $drugs = DB::table('drugs')->whereNull('deleted_at')->where('available', 1)->pluck('name', 'id')->toArray(); $staff_array = $this->userService->pluckUserFullName(); $drug_forms = DB::table('drug_forms')->whereNull('deleted_at')->pluck('name', 'id')->toArray(); $batches_array = DB::table('item_batch_watcher')->where('pharmacy_stock', '>', 0)->orWhere('store_stock', '>', 0)->get(); return view('pharmacy::pharmacy.approve_ward_dispensing_per_chart',compact('drug_forms','staff_array', 'wards', 'ward_id', 'search_by', 'drugs', 'drugs_to_dispense_array', 'quantities_to_dispense_array', 'incoming_chart_record', 'batches_array', 'cancer_protocol_orders')); } public function cancel_ward_dispensing_per_chart($incoming_ward_chart_id) { $incoming_chart_record = IncomingWardChart::find($incoming_ward_chart_id); if ($incoming_chart_record) { if (!is_null($incoming_chart_record->has_cancer_protocol)) { $cancer_protocol_ids = explode(",", $incoming_chart_record->has_cancer_protocol); $delete_cancer_protocol_orders = CancerProtocolWardChart::whereIn('id', $cancer_protocol_ids)->delete(); } $incoming_chart_record->delete(); flash("Ward chart deleted successfully")->success(); } else { flash("Could not cancel ward chart")->error(); } return redirect('incoming_ward_charts'); } public function store_approved_dispensings_per_chart(Request $request) { /* *update the completion_status to 1 in ward_dispensation_per_chart table *record the records in the ward treatment dispensations table, created_by shd be equal to received_by *store details in the ward_chart_approvals table and update the records with the approval_id */ $protocol_drug_ids_arr =$batch_id= []; if (isset($request->protocol_ward_charts_id)) { $protocol_ward_charts_id_arr = $request->protocol_ward_charts_id; $protocol_ward_id_arr = $request->protocol_ward_id; $protocol_patient_id_arr = $request->protocol_patient_id; $protocol_episode_id_arr = $request->protocol_episode_id; $protocol_quantity_to_dispense_arr = $request->protocol_quantity_to_dispense; $protocol_instruction_arr = $request->protocol_instruction; $protocol_drug_ids_arr = $request->protocol_drug_ids; $protocol_orders = CancerProtocolWardChart::whereIn('id', $protocol_ward_charts_id_arr)->get(); if (count($protocol_orders) > 0) { // check if the drug is consuming from more than one batch foreach ($request->cancer_batch_item_ids as $key => $id ){ $batch_id[$id][] = $request->cancer_batch_dispensed_from[$key]; } foreach ($protocol_orders as $protocol_order) { $protocol_order->approved_by = Auth::id(); $protocol_order->completion_status = 1; $protocol_order->update(); } /* create a new entry for the approval that has been done */ $chart_approval = new WardChartApproval; $chart_approval->drug_ids = implode(",", $protocol_drug_ids_arr); $chart_approval->quantity_dispensed = implode(",", $protocol_quantity_to_dispense_arr); $chart_approval->comments = implode(",", $protocol_instruction_arr); $chart_approval->received_by = $request->received_by; $chart_approval->approval_date = is_null($request->approval_date) ? Carbon::now() : Carbon::createFromFormat('d/m/Y',$request->approval_date)->toDateString(); $chart_approval->incoming_ward_charts_id = $request->incoming_chart_id; $chart_approval->cancer_protocol_order_id = implode(",", $protocol_ward_charts_id_arr); $chart_approval->created_by = Auth::id(); $chart_approval->ward_id = $protocol_ward_id_arr[0] ?? 0; $chart_approval->save(); // Loop through each entry and group by drug ID foreach ($protocol_drug_ids_arr as $index => $drugId) { $patientId = $protocol_patient_id_arr[$index]; $quantity = $protocol_quantity_to_dispense_arr[$index]; $esp = $protocol_episode_id_arr[$index]; // Initialize the drug group if not already created if (!isset($groupedData[$drugId])) { $groupedData[$drugId] = []; } // Append the patient and quantity data $groupedData[$drugId][] = [ 'patient_id' => $patientId, 'episode_id'=>$esp, 'quantity' => $quantity, 'batch_id' => null, ]; } foreach($batch_id as $ind => $batch){ foreach ($batch as $key => $value) { foreach($groupedData[$ind] as $key => $data){ $groupedData[$ind][$key]['batch_id'][] = $value; } } } foreach($groupedData as $ind => $data){ foreach($data as $d){ WardTreatmentBatchDispensation::create([ "patient_id"=>$d['patient_id'], "episode_id"=>$d['episode_id'], "item_id"=>$ind, "incoming_ward_chart_id"=>$request->incoming_chart_id, "item_batch_id"=>implode(",", $d['batch_id']??[]), ]); } } /* update the ward_treatment_dispensations table to show the drugs on the respective inpatient sheet */ for ($i=0; $i < count($protocol_patient_id_arr) ; $i++) { $ward_treatment_id = $this->dispensationService->saveDispensation((int)$protocol_patient_id_arr[$i], (int)$protocol_episode_id_arr[$i], $protocol_drug_ids_arr[$i], (int)$protocol_quantity_to_dispense_arr[$i], 0, $protocol_ward_id_arr[$i] ?? 0, $request->incoming_chart_id); /*====== reduce the pharmacy stock if some quantity has been given.========*/ if ($protocol_quantity_to_dispense_arr[$i] > 0) { $ward_drug_details = Drug::find($protocol_drug_ids_arr[$i]); $current_stock = $ward_drug_details->pharmacy_stock; $new_stock = $current_stock - $protocol_quantity_to_dispense_arr[$i]; $ward_drug_details->pharmacy_stock = $new_stock; $ward_drug_details->update(); } } /* ==== reduction according to batches selected ==== */ $cancer_batch_item_ids_array = $request->cancer_batch_item_ids ?? []; $cancer_items_batches_array = $request->cancer_batch_dispensed_from ?? []; $cancer_items_quantities_array = $request->cancer_batch_quantity_dispensed ?? []; for ($i=0; $i < count($cancer_batch_item_ids_array) ; $i++) { reduce_batch_item_stock(1,$cancer_batch_item_ids_array[$i],$cancer_items_batches_array[$i],'drugs','pharmacy_stock',$cancer_items_quantities_array[$i],'incoming_ward_charts','Drug',$request->incoming_chart_id,null); // reduce_batch_item_from_pharmacy(1, $cancer_batch_item_ids_array[$i], $cancer_items_batches_array[$i], $cancer_items_quantities_array[$i], "incoming_ward_charts", $request->incoming_chart_id, null); } /* ==== end of batch === */ } } $incoming_chart_to_update = IncomingWardChart::find($request->incoming_chart_id); if ($incoming_chart_to_update) { $incoming_chart_to_update->approved_by = Auth::id(); $incoming_chart_to_update->completion_status = 1; $incoming_chart_to_update->update(); // check if there are normal drugs to process if (isset($request->drug_id) && is_array($request->drug_id)) { // check if the drug is consuming from more than one batch foreach ($request->batch_item_ids as $key => $id ){ $batch_id[$id][] = $request->batch_dispensed_from[$key]; } /* get some patient details from the incoming_ward_charts table*/ $patient_ids_array = explode(",", $incoming_chart_to_update->patient_ids); $episode_ids_array = explode(",", $incoming_chart_to_update->episode_ids); $drug_ids_array = explode(",", $incoming_chart_to_update->drug_ids); $quantities_given_array = explode(",", $incoming_chart_to_update->quantity_given); $wards_array = explode(",", $incoming_chart_to_update->ward_ids); /* create a new entry for the approval that has been done */ $chart_approval = new WardChartApproval; $chart_approval->drug_ids = implode(",", $request->drug_id); $chart_approval->quantity_dispensed = implode(",", $request->quantity_dispensed); $chart_approval->comments = implode(",", $request->comments); $chart_approval->received_by = $request->received_by; $chart_approval->approval_date = is_null($request->approval_date) ? Carbon::now() : Carbon::createFromFormat('d/m/Y',$request->approval_date)->toDateString(); $chart_approval->incoming_ward_charts_id = $request->incoming_chart_id; $chart_approval->created_by = Auth::id(); $chart_approval->ward_id = is_null($incoming_chart_to_update) ? 0 : $incoming_chart_to_update->chart_ward_id; $chart_approval->save(); $groupedData = []; // Loop through each entry and group by drug ID foreach ($drug_ids_array as $index => $drugId) { $patientId = $patient_ids_array[$index]; $quantity = $quantities_given_array[$index]; $esp = $episode_ids_array[$index]; // Initialize the drug group if not already created if (!isset($groupedData[$drugId])) { $groupedData[$drugId] = []; } // Append the patient and quantity data $groupedData[$drugId][] = [ 'patient_id' => $patientId, 'episode_id'=>$esp, 'quantity' => $quantity, 'batch_id' => null, ]; } foreach($batch_id as $ind => $batch){ foreach ($batch as $key => $value) { foreach($groupedData[$ind] as $key => $data){ $groupedData[$ind][$key]['batch_id'][] = $value; } } } foreach($groupedData as $ind => $data){ foreach($data as $d){ WardTreatmentBatchDispensation::create([ "patient_id"=>$d['patient_id'], "episode_id"=>$d['episode_id'], "item_id"=>$ind, "incoming_ward_chart_id"=>$incoming_chart_to_update->id, "item_batch_id"=>implode(",", $d['batch_id']??[]), ]); } } /* update the ward_treatment_dispensations table to show the drugs on the respective inpatient sheet */ for ($i=0; $i < count($patient_ids_array) ; $i++) { $ward_treatment_id = $this->dispensationService->saveDispensation((int)$patient_ids_array[$i], (int)$episode_ids_array[$i], $drug_ids_array[$i], (int)$quantities_given_array[$i], 0, $wards_array[$i] ?? 0, $incoming_chart_to_update->id); /*====== reduce the pharmacy stock if some quantity has been given.========*/ if ($drug_ids_array[$i] != "" && $quantities_given_array[$i] != "") { $drug = Drug::find($drug_ids_array[$i]); if ($drug) { $current_stock = $drug->pharmacy_stock; $new_stock = $current_stock - $quantities_given_array[$i]; $drug->pharmacy_stock = $new_stock; $drug->update(); } } } /* ==== reduction according to batches selected ==== */ $items_ids_array = $request->batch_item_ids ?? []; $items_batches_array = $request->batch_dispensed_from ?? []; $items_quantities_array = $request->batch_quantity_dispensed ?? []; for ($i=0; $i < count($items_batches_array) ; $i++) { reduce_batch_item_stock(1,$items_ids_array[$i],$items_batches_array[$i],'drugs','pharmacy_stock',$items_quantities_array[$i],'incoming_ward_charts','Drug',$request->incoming_chart_id,null); // reduce_batch_item_from_pharmacy(1, $items_ids_array[$i], $items_batches_array[$i], $items_quantities_array[$i], "incoming_ward_charts", $request->incoming_chart_id, null); } /* ==== end of batch === */ } flash("Ward chart has been approved")->success(); if (count($protocol_drug_ids_arr) > 0) { session()->put('request_array', $request->all()); return redirect('print_protocol_ward_chart'); } return redirect('incoming_ward_charts'); } else { flash("Ward Chart not found")->error(); return redirect()->back()->withInput(); } } /* put patient_id and episode_id in session. Done when one clicks the "view inpatient sheet" on ward_dispensing page */ public function set_inpatient_sheet($patient_id, $episode_id) { session()->put('patient_id', $patient_id); session()->put('episode_id', $episode_id); return redirect('in_patient_sheet'); } public function drug_chart_details(Request $request) { $drug_id = $request->drug_id; $incoming_chart_id = $request->chart_id; $incoming_chart_record = IncomingWardChart::find($incoming_chart_id); if (!is_null($incoming_chart_record)) { $patient_ids_array = explode(",", $incoming_chart_record->patient_ids); $episode_ids_array = explode(",", $incoming_chart_record->episode_ids); $inpatient_info_ids_array = explode(",", $incoming_chart_record->inpatient_info_ids); $drug_ids_array = explode(",", $incoming_chart_record->drug_ids); $ward_ids_array = explode(",", $incoming_chart_record->ward_ids); $quantity_given_array = explode(",", $incoming_chart_record->quantity_given); } $code = ""; $counter = 1; for ($i=0; $i < count($drug_ids_array) ; $i++) { if ($drug_ids_array[$i] == $drug_id) { $code .= ""; $code .= ""; $code .= $counter; $code .= ""; $code .= ""; $code .= get_full_name($patient_ids_array[$i], 'id', 'first_name', 'last_name', 'patients') . " (" . get_name($patient_ids_array[$i], 'id', 'number', 'patients') . ")"; $code .= ""; $code .= ""; $code .= get_name($ward_ids_array[$i], 'id', 'name', 'wards'); $code .= ""; $code .= ""; $code .= get_name($drug_ids_array[$i], 'id', 'name', 'drugs'); $code .= ""; $code .= ""; $code .= $quantity_given_array[$i]; $code .= ""; $code .= ""; $counter++; } } /*if ($ward_dipensings_per_chart->count() > 0){ foreach ($ward_dipensings_per_chart as $record){ $code .= ""; $code .= ""; $code .= $counter; $code .= ""; $code .= ""; $code .= get_full_name($record->patient_id, 'id', 'first_name', 'last_name', 'patients') . " (" . get_name($record->patient_id, 'id', 'number', 'patients') . ")"; $code .= ""; $code .= ""; $code .= get_name($record->ward_id, 'id', 'name', 'wards'); $code .= ""; $code .= ""; $code .= get_name($record->drug_id, 'id', 'name', 'drugs'); $code .= ""; $code .= ""; $code .= $record->quantity_given; $code .= ""; $code .= ""; $counter++; } } else { $code .= "

No records

"; }*/ // check if the code is empty for when clinics selected are not available if ($code == ''){ $code .= "

No record

"; } return $code; } public function view_ward_patient_prescriptions(Request $request) { $patient_id = $request->patient_id; $episode_id = $request->episode_id; $ward_prescriptions = WardTreatment::where(['patient_id' => $patient_id, 'episode_id' => $episode_id])->get(); $code = ""; if(count($ward_prescriptions) > 0){ foreach($ward_prescriptions as $treatment){ $drug_explode = explode(",", $treatment->drugs); $dose_explode = explode(",", $treatment->doses); $dose2_explode = explode(",", $treatment->dose2); $drug_frequency_explode = explode(",", $treatment->frequencies); $instruction_explode = explode(",", $treatment->instruction); $duration_explode = explode(",", $treatment->durations); //$long_term_explode = explode(",", $treatment_row['Long_Term']); $dispense_explode = explode(",", $treatment->dispensed); //$form_explode = explode(",", $treatment_row['Form']); $quantity_to_dispense = explode(",", $treatment->quantities_dispensed); for ($x = 0; $x < count($drug_explode); $x++){ $code .= ""; $code .= ""; $code .= $x+1; $code .= ""; $code .= ""; if(get_name($drug_explode[$x], 'id', 'insurance_coverage', 'drugs') == 1){ $code .= "".get_name($drug_explode[$x], 'id', 'name', 'drugs').""; } else{ $code .= "".get_name($drug_explode[$x], 'id', 'name', 'drugs').""; } $code .= ""; $code .= ""; $form_id = isset($drug_explode[$x]) ? get_name($drug_explode[$x], 'id', 'form_id', 'drugs') : ""; $unit_id = isset($drug_explode[$x]) ? get_name($drug_explode[$x], 'id', 'unit_id', 'drugs') : ""; $form_name = isset($form_id) ? get_name($form_id, 'id', 'name', 'drug_forms') : ""; $unit_name = isset($unit_id) ? get_name($unit_id, 'id', 'name', 'drug_units') : ""; $code .= isset($dose_explode[$x]) ? $dose_explode[$x] : "" . $unit_name; $code .= ""; $code .= ""; $code .= get_name( isset($drug_frequency_explode[$x]) ? $drug_frequency_explode[$x] : "", 'id', 'name', 'dosage_frequencies'); $code .= ""; $code .= ""; $code .= isset($duration_explode[$x]) ? $duration_explode[$x] : ""; $code .= ""; $code .= ""; $code .= isset($quantity_to_dispense[$x]) ? $quantity_to_dispense[$x] : ""; $code .= ""; $code .= ""; $code .= isset($instruction_explode[$x]) ? $instruction_explode[$x] : ""; $code .= ""; $code .= ""; } $code .= "Prescribed by ".get_full_name($treatment->created_by, "id", "first_name", "last_name", "users")." on ".streamline_date($treatment->created_at).""; } } else { $code .= "

No prescriptions recorded in the system

"; } return $code; } public function edit_ward_dispensing_chart(Request $request, $id) { $incoming_chart = IncomingWardChart::find($id); $patient_ass_array = []; //holding the associative array we will loop through $patient_episodes_array = []; $patient_inpatient_info_array = []; if (!is_null($incoming_chart)) { $patient_ids_array = explode(",", $incoming_chart->patient_ids); $episode_ids_array = explode(",", $incoming_chart->episode_ids); $inpatient_info_ids_array = explode(",", $incoming_chart->inpatient_info_ids); $drug_ids_array = explode(",", $incoming_chart->drug_ids); $quantity_given_array = explode(",", $incoming_chart->quantity_given); for ($i=0; $i < count($patient_ids_array) ; $i++) { $inner_array = []; if (array_key_exists($patient_ids_array[$i], $patient_ass_array)) { /* check just in case the same drug appears for the same patient twice then ++ quantity */ if (array_key_exists($drug_ids_array[$i], $patient_ass_array[$patient_ids_array[$i]])) { $previous_qty = $patient_ass_array[$patient_ids_array[$i]][$drug_ids_array[$i]]; $patient_ass_array[$patient_ids_array[$i]][$drug_ids_array[$i]] = $previous_qty + $quantity_given_array[$i]; } else{ $patient_ass_array[$patient_ids_array[$i]][$drug_ids_array[$i]] = $quantity_given_array[$i]; } } else{ $inner_array[$drug_ids_array[$i]] = $quantity_given_array[$i]; $patient_ass_array[$patient_ids_array[$i]] = $inner_array; } //we need these 2 array below $patient_episodes_array[$patient_ids_array[$i]] = $episode_ids_array[$i]; $patient_inpatient_info_array[$patient_ids_array[$i]] = $inpatient_info_ids_array[$i]; } } $drugs = Drug::where('available', 1)->orderby('name')->pluck('name', 'id')->prepend('-- Select Drug --', '')->toArray(); return view('pharmacy::pharmacy.edit_ward_chart', compact('drugs', 'incoming_chart', 'patient_ass_array', 'patient_episodes_array', 'patient_inpatient_info_array')); } public function update_ward_dispensing_per_chart(Request $request) { $incoming_chart_to_update = IncomingWardChart::find($request->incoming_chart_id); $dipensed_drugs_array = $request->dispensed_drugs; $quantity_dispensed_array = $request->quantity_dispensed; $patient_ids_array = $request->patient_id; $episode_ids_array = $request->episode_id; $inpatient_info_ids_array = $request->inpatient_info_id; $ward_ids_array = $request->ward_id; $chart_ward_id = $request->chart_ward_id; //if it is 0, then it is a chart from all wards $clean_patient_id_array = []; $clean_episode_id_array = []; $clean_inpatient_info_id_array = []; $clean_ward_id_array = []; $clean_drug_id_array = []; $clean_quantity_given_array = []; for ($i=0; $i < count($dipensed_drugs_array) ; $i++) { if (!is_null($dipensed_drugs_array[$i]) && !is_null($quantity_dispensed_array[$i])) { $clean_patient_id_array[] = $patient_ids_array[$i]; $clean_episode_id_array[] = $episode_ids_array[$i]; $clean_inpatient_info_id_array[] = $inpatient_info_ids_array[$i]; $clean_ward_id_array[] = $ward_ids_array[$i]; $clean_drug_id_array[] = $dipensed_drugs_array[$i]; $clean_quantity_given_array[] = $quantity_dispensed_array[$i]; } } $incoming_chart_to_update->patient_ids = implode(",", $clean_patient_id_array); $incoming_chart_to_update->episode_ids = implode(",", $clean_episode_id_array); $incoming_chart_to_update->inpatient_info_ids = implode(",", $clean_inpatient_info_id_array); $incoming_chart_to_update->drug_ids = implode(",", $clean_drug_id_array); $incoming_chart_to_update->quantity_given = implode(",", $clean_quantity_given_array); $incoming_chart_to_update->ward_ids = implode(",", $clean_ward_id_array); $incoming_chart_to_update->chart_ward_id = $request->chart_ward_id; $incoming_chart_to_update->updated_by = Auth::id(); $incoming_chart_to_update->update(); flash('Patient charts have been updated')->success(); return redirect('incoming_ward_charts'); } public function return_drugs_per_chart(Request $request) { $wards = DB::table('wards')->where('available', 1)->orderBy('name')->pluck("name", "id")->toArray(); $wards = ['0' => 'All wards'] + $wards; $filters = []; if (isset($request->patient_id) && $request->patient_id != 0) { $filters[] = ['patient_id', '=', $request->patient_id]; } //get all inpatients that are not discharged $ipatients = InpatientInfo::where(['discharged' => 0])->orderBy('created_at', 'desc')->get(); foreach($ipatients as $patient){ $patients[]= Patient::find($patient->patient_id); } if (isset($request->ward_id)) { $ward_id = $request->ward_id; $drugs = Drug::where('available', 1)->orderby('name')->pluck('name', 'id')->prepend('-- Select Drug --', '')->toArray(); if($request->search_by == 0){ // last 24 hours $last_day = Carbon::now()->subDay(); array_push($filters, ['created_at', '>', $last_day]); } elseif($request->search_by == 1){ // custom date $start_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); } elseif($request->search_by == 2){ // custom date range $start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); } elseif($request->search_by == 3){ // } $search_by = $request->search_by; if (!empty($ward_id) && $ward_id != 0) { $inpatients = InpatientInfo::where(['ward_id' => $ward_id, 'discharged' => 0])->where($filters)->orderBy('created_at', 'desc')->get(); } else { $inpatients = InpatientInfo::where(['discharged' => 0])->where($filters)->orderBy('created_at', 'desc')->get(); } foreach($inpatients as $patient){ $patient->ward_treatment =WardTreatmentDispensation::where(['patient_id' => $patient->patient_id, 'episode_id' => $patient->episode_id])->get(); $batches_items =WardTreatmentBatchDispensation::where(['patient_id' => $patient->patient_id, 'episode_id' => $patient->episode_id])->get(); if (count($batches_items) > 0) { $batch_id_records=[]; foreach ($batches_items as $batches) { $batch_id_records[] = ($batches->item_batch_id!=null)? explode(',',$batches->item_batch_id):[]; } //check the count of ward_treatment if (count($patient->ward_treatment) > count($batch_id_records)){ //add the difference to as the start of the array for ($i=count($batch_id_records); $i < count($patient->ward_treatment); $i++) { array_unshift($batch_id_records, []); } } $patient->batch_items = $batch_id_records; }else{ $patient->batch_items = []; } } } else { $inpatients = []; $drugs = []; $search_by = ""; $ward_id = 0; // $patients=[]; } return view('pharmacy::pharmacy.return_drugs_per_chart', compact('inpatients','patients', 'wards', 'ward_id', 'search_by', 'drugs')); } public function store_returned_drugs_per_chart(Request $request) { $drug_ids_array = $request->drug_id; $ward_treatment_dispensations_id_array = $request->ward_treatment_dispensations_id; $quantity_dispensed_array = $request->quantity_dispensed; $quantity_to_return_array = $request->quantity_to_return; $patient_ids_array = $request->patient_id; $episode_ids_array = $request->episode_id; $inpatient_info_ids_array = $request->inpatient_info_id; $selected_batch_id_array = $request->batch_id; $batch_id_array = $request->ward_treatment_batch_id; for ($i = 0; $i < count($drug_ids_array); $i++) { if (!isset($quantity_to_return_array[$i]) || !isset($quantity_dispensed_array[$i]) || !isset($ward_treatment_dispensations_id_array[$i])) { continue; } if ($quantity_to_return_array[$i] > 0 && !($quantity_dispensed_array[$i] < $quantity_to_return_array[$i])) { $difference_in_drugs = $quantity_dispensed_array[$i] - $quantity_to_return_array[$i]; $returned_drugs = new ReturnedDrugsPerWardChart; $returned_drugs->ward_treatment_dispensation_id = $ward_treatment_dispensations_id_array[$i]; $returned_drugs->quantity_before = $quantity_dispensed_array[$i]; $returned_drugs->quantity_returned = $quantity_to_return_array[$i]; $returned_drugs->created_by = Auth::id(); $returned_drugs->save(); $ward_treatments_dispensation = WardTreatmentDispensation::find($ward_treatment_dispensations_id_array[$i]); $ward_treatments_dispensation->quantity_given = $difference_in_drugs; $ward_treatments_dispensation->save(); //check if selected batch id is if (isset($request->batch_id)){$selected_batch_id= $selected_batch_id_array[$i];}else{$selected_batch_id=null;} $drug = Drug::find($drug_ids_array[$i]); if ($drug) { $drug->pharmacy_stock = $drug->pharmacy_stock + $quantity_to_return_array[$i]; $drug->update(); //return quantity to batch $this->itemService->returnStockToAnySection($item_type=1,$drug_ids_array[$i],$ward_treatments_dispensation,$patient_ids_array[$i],$episode_ids_array[$i], $quantity_to_return_array[$i],'pharmacy_stock',$selected_batch_id); } } } flash("Drugs have been returned from ward per chart")->success(); return redirect('return_drugs_per_chart'); } public function ward_dispensing_per_chart_report(Request $request) { $ward_id = $request->ward_id; $filters = []; if($request->search_by == 1){ // custom date $start_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); } elseif($request->search_by == 2){ // custom date range $start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); } else { // last 24 hours $last_day = Carbon::now()->subDay(); array_push($filters, ['created_at', '>', $last_day]); } $search_by = $request->search_by; if (!empty($ward_id) && $ward_id != 0) { $ward_chart_approvals = WardChartApproval::where(['ward_id' => $ward_id])->where($filters)->orderBy('created_at', 'desc')->get(); } else { $ward_chart_approvals = WardChartApproval::where($filters)->orderBy('created_at', 'desc')->get(); } $staff_array = $this->userService->pluckUserFullName(); $wards = DB::table('wards')->where('available', 1)->orderBy('name')->pluck("name", "id")->toArray(); $wards = ['0' => 'All wards'] + $wards; return view('pharmacy::pharmacy.ward_dispensing_per_chart_report', compact('ward_chart_approvals', 'wards', 'staff_array', 'ward_id', 'search_by')); } public function ward_chart_report_details(Request $request): View { $chart_approval_record = WardChartApproval::find($request->approval_id); return view('pharmacy::pharmacy.ward_chart_report_details', compact('chart_approval_record')); } public function print_ward_chart_report_details($approval_id): RedirectResponse { $chart_record = WardChartApproval::find($approval_id); if (!$chart_record || is_null($chart_record->cancer_protocol_order_id)) { return redirect()->back(); } $cancer_records = CancerProtocolWardChart::whereIn('id', explode(",", $chart_record->cancer_protocol_order_id)) ->get(); if (count($cancer_records) === 0) { return redirect()->back(); } $request_array = ["protocol_instruction" => explode(",", $chart_record->comments)]; foreach ($cancer_records as $cancer_record) { $protocol_drug_ids = explode(",", $cancer_record->protocol_drug_id); $request_array = array_merge_recursive( $request_array, [ "protocol_ward_id" => array_fill(0, count($protocol_drug_ids), $cancer_record->ward_id), "protocol_patient_id" => array_fill(0, count($protocol_drug_ids), $cancer_record->patient_id), "protocol_episode_id" => array_fill(0, count($protocol_drug_ids), $cancer_record->episode_id), "protocol_drug_dose" => explode(",", $cancer_record->protocol_drug_dose), "protocol_dosage_to_dispense" => explode(",", $cancer_record->protocol_dosage_to_dispense), "protocol_quantity_to_dispense" => explode(",", $cancer_record->protocol_quantity_to_dispense), "protocol_drug_ids" => $protocol_drug_ids, "protocol_drug_dose_label" => explode(",", $cancer_record->protocol_drug_dosage_label), ] ); } session()->put('request_array', $request_array); return redirect('print_protocol_ward_chart'); } public function drugs_stock_reconciliation(Request $request) { $drugs = []; $item_ids_array = $request->search_items_ids; if ($item_ids_array) { $is_all_items = in_array("all_items", $item_ids_array); if ($is_all_items) { $drugs = Drug::where('available', 1)->orderby('name', 'asc')->get(); } else{ $drugs = Drug::whereIn('id', $item_ids_array)->orderBy('name', 'asc')->get(); } } $chart_of_accounts = ChartOfAccount::orderBy('name', 'asc')->pluck('name', 'id')->toArray(); $chart_of_accounts = ['' => '- select -'] + $chart_of_accounts; $drugs_dropdown = DB::table('drugs')->where('available', 1)->whereNull('deleted_at')->orderBy('name', 'asc')->pluck('name','id')->prepend('All drugs', 'all_items')->toArray(); $stock_adjustment_chart_of_account = ChartOfAccount::where('slug', 'stock_adjustment')->first(); return view('pharmacy::pharmacy.drugs_stock_reconciliation', compact('drugs', 'chart_of_accounts', 'drugs_dropdown', 'stock_adjustment_chart_of_account')); } public function store_pharmacy_drugs_stock_count(Request $request) { $drugs_ids_array = $request->drug_id; $cost_price_array = $request->cost_price; $system_stock_array = $request->system_stock; $physical_stock_array = $request->physical_stock; $difference_array = $request->difference; $expiry_date_array = $request->expiry_date; $reason_for_difference_array = $request->reason_for_difference; $batch_drug_ids_array = $request->batch_drug_id; $unique_drug_ids_with_batches_array = array_unique($batch_drug_ids_array); $batch_numbers_array = $request->batch_number; $batch_quantity_balances_array = $request->batch_quantity_balance; $batch_expiry_dates_array = $request->expiry_date; $batch_unit_cost = $request->batch_unit_cost; $batch_db_record_ids_array = $request->item_batch_watcher_id; $batch_unit_cost = $request->batch_unit_cost; $drugs_with_initial_stock_array = is_null($request->is_initial_stock) ? [] : $request->is_initial_stock; $stock_adjustment_chart_of_account = ChartOfAccount::where('slug', 'stock_adjustment')->first(); $affected_account_id = $stock_adjustment_chart_of_account->id; $opening_inventory_chart_of_account = ChartOfAccount::where('slug', 'opening_inventory')->first(); //$affected_account_id = $request->account_id; //get the max identifier $max_stock_count_identifier = DB::table('pharmacy_stock_reconciliations')->max('stock_count_identifier'); $reconcile_drug_pharmacy_stock = true; //update batch tracking tables with reconciliations for ($i=0; $i < count($batch_numbers_array) ; $i++) { if (!is_null($batch_numbers_array[$i]) && !is_null($batch_quantity_balances_array[$i])) { //enforce double entry per batch if (in_array($batch_drug_ids_array[$i], $drugs_with_initial_stock_array)) { $affected_account_id = $opening_inventory_chart_of_account->id;//override adjustment a/c to be opening_inv } else{ $affected_account_id = $stock_adjustment_chart_of_account->id; } account_for_batch_reconciliations_difference(1, $batch_drug_ids_array[$i], $affected_account_id, $batch_numbers_array[$i], $batch_quantity_balances_array[$i], $request->reconciliation_date, "pharmacy", null); reconcile_batches(1, $batch_drug_ids_array[$i], $batch_numbers_array[$i], $batch_quantity_balances_array[$i], $batch_expiry_dates_array[$i], "pharmacy",$batch_unit_cost[$i]??0, $batch_db_record_ids_array[$i]??0, null); } } if (isset($request->reconcile_stock)) { for ($x = 0; $x < count($drugs_ids_array); $x++): /* check if the difference value is not null and then update the drug */ if (!is_null($difference_array[$x])) { $physical_stock = new PharmacyStockReconciliation; $physical_stock->drug_id = $drugs_ids_array[$x]; $physical_stock->system_stock = $system_stock_array[$x]; $physical_stock->physical_stock = $physical_stock_array[$x]; $physical_stock->difference = $difference_array[$x]; $physical_stock->reason_for_difference = $reason_for_difference_array[$x]; $physical_stock->completion_status = 1; $physical_stock->affected_account_id = $affected_account_id; $physical_stock->reconciliation_date = $request->reconciliation_date; $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 = PharmacyStockReconciliation::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(); //update the system stock levels with the newly counted physical stock //update only those with new physical value $drugs = Drug::find($drugs_ids_array[$x]); $drugs->pharmacy_stock = $physical_stock_array[$x]; $drugs->expiry_date = $expiry_date_array[$x]; if (in_array($drugs->id, $drugs_with_initial_stock_array)) { $existing_opening_stock = is_null($drugs->opening_stock) ? 0 : $drugs->opening_stock; $drugs->opening_stock = $existing_opening_stock + $physical_stock_array[$x]; $drugs->opening_cost_price = $cost_price_array[$x]; $drugs->opening_stock_date = $request->reconciliation_date; $drugs->pharmacy_opening_stock = $physical_stock_array[$x]; $affected_account_id = $opening_inventory_chart_of_account->id;//overide adjustment a/c to be opening_inv } else{ $affected_account_id = $stock_adjustment_chart_of_account->id; } $drugs->updated_by = Auth::id(); //enforce double entry //account_for_stock_reconciliations_difference($item_type = 1, $drugs_ids_array[$x], $affected_account_id, $difference_array[$x], $cost_price_array[$x], $request->reconciliation_date); $reconcile_drug_pharmacy_stock = $drugs->update(); }else $reconcile_drug_pharmacy_stock = true; endfor; if ($reconcile_drug_pharmacy_stock): flash('Stock levels have been reconciled')->success(); return redirect('pharmacy_stock_sheet'); endif; } else if(isset($request->save_stock)){ //save these for editing later on for ($x = 0; $x < count($drugs_ids_array); $x++): $physical_stock = new PharmacyStockReconciliation; $physical_stock->drug_id = $drugs_ids_array[$x]; $physical_stock->system_stock = $system_stock_array[$x]; $physical_stock->physical_stock = $physical_stock_array[$x]; $physical_stock->difference = $difference_array[$x]; $physical_stock->reason_for_difference = $reason_for_difference_array[$x]; $physical_stock->completion_status = 0; $physical_stock->created_by = Auth::id(); $saved_physical_stock = $physical_stock->save(); //add stock_count_identifier that will be used in resuming edit $physical_stock_record_to_that_will_be_updated = PharmacyStockReconciliation::find($physical_stock->id); $physical_stock_record_to_that_will_be_updated->stock_count_identifier = $max_stock_count_identifier+1;//increase ID by 1 for new $physical_stock_record_to_that_will_be_updated->update(); endfor; if ($saved_physical_stock): flash('Physical stock has been saved. You can resume later')->success(); return redirect('pharmacy_stock_sheet'); endif; } flash('Sorry, unable to update stock')->error(); return redirect()->back(); } public function drugs_stock_reconciliation_report() { $reconciled_stocks = PharmacyStockReconciliation::groupBy("stock_count_identifier")->get(); return view('pharmacy::pharmacy.drugs_stock_reconciliation_report',compact('reconciled_stocks')); } /* stock reconciliation report details */ public function drugs_stock_reconciliation_report_details(Request $request) { $drugs_reconciled = PharmacyStockReconciliation::where(['stock_count_identifier' => $request->stock_count_identifier])->get(); return view('pharmacy::pharmacy.drugs_stock_reconciliation_report_details',compact('drugs_reconciled')); } public function alter_prescriptions($treatment_id, $patient_id) { $treatment = Treatment::find($treatment_id); session()->put('alter_episode_id', $treatment->episode_id); session()->put('alter_patient_id', $patient_id); return redirect('/prescriptions/create'); } public function patient_drugs_given_so_far($patient_id, $episode_id) { $ward_quantities_given_option = DB::table('ward_treatment_dispensations')->where(['patient_id' => $patient_id, 'episode_id' => $episode_id])->groupBy('drug_id')->selectRaw('*, sum(quantity_given) as quantity_given')->get(); $original_ward_presc = WardTreatment::where(['patient_id' => $patient_id, 'episode_id' => $episode_id])->get(); $stopped_ward_drugs_array = []; foreach ($original_ward_presc as $presc_record) { $stopped_drugs_array = is_null($presc_record->stopped_drugs) ? [] : explode(",", $presc_record->stopped_drugs); $stopped_ward_drugs_array = array_merge($stopped_ward_drugs_array, $stopped_drugs_array); } $html_text = ""; $html_text .= ""; $html_text .= ""; $html_text .= ""; $html_text .= ""; $html_text .= ""; foreach($ward_quantities_given_option as $record){ $html_text .= ""; $dispensation_details = WardTreatmentDispensation::where(['patient_id' => $patient_id, 'episode_id' => $episode_id, 'drug_id' => $record->drug_id])->get(); $html_text .= ""; $html_text .= ""; $html_text .= ""; for($i = 1; $i < count($dispensation_details); $i++) { $html_text .= ""; $html_text .= ""; $html_text .= ""; $html_text .= ""; } $html_text .= ""; } $html_text .= '
Drug Name Date Quantity
"; $html_text .= get_name($record->drug_id, "id", "name", "drugs"); if (in_array($record->drug_id, $stopped_ward_drugs_array)) { $html_text .= "

"; } else { $html_text .= "

"; } $html_text .= "
" . streamline_date_time($dispensation_details[0]->created_at) . " by " . get_full_name($dispensation_details[0]->created_by, "id", "first_name", "last_name", "users") . "" . $dispensation_details[0]->quantity_given . "
" . streamline_date_time($dispensation_details[$i]->created_at) . " by " . get_full_name($dispensation_details[$i]->created_by, "id", "first_name", "last_name", "users") . "" . $dispensation_details[$i]->quantity_given . "
Total " . $record->quantity_given . "
'; return json_encode([ "html" => $html_text ]); } public function pharmacy_dispensation_report_patients(Request $request) { $filters = []; if($request->search_by == 0){ // last 24 hours array_push($filters, ['created_at', '>', Carbon::now()->subDay()]); $search_text = "Showing dispensations in the past 24 hours"; } elseif($request->search_by == 1){ // custom date $start_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); $search_text = "Showing dispensations made between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } elseif($request->search_by == 2){ // custom date range $start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); $search_text = "Showing dispensations made between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } else { // last 24 hours array_push($filters, ['created_at', '>', Carbon::now()->subDay()]); $search_text = "Showing dispensations in the past 24 hours"; } $dispensations = PatientDispensing::where($filters)->get(); return view('pharmacy::pharmacy.pharmacy_dispensation_report_patients', compact('dispensations', 'search_text')); } public function cancel_dispensation($id) { $dispensation = PatientDispensing::find($id); $cancelled_dispensation = new CancelledPatientOpdDispensation(); $cancelled_dispensation->patient_id = $dispensation->patient_id; $cancelled_dispensation->treatment_id = $dispensation->treatment_id; $cancelled_dispensation->drugs = $dispensation->drugs; $cancelled_dispensation->dose = $dispensation->dose; $cancelled_dispensation->dose2 = $dispensation->dose2; $cancelled_dispensation->drug_frequency = $dispensation->drug_frequency; $cancelled_dispensation->instructions = $dispensation->instructions; $cancelled_dispensation->duration = $dispensation->duration; $cancelled_dispensation->quantity_dispensed = $dispensation->quantity_dispensed; $cancelled_dispensation->tta = $dispensation->tta; $cancelled_dispensation->previous_created_by = $dispensation->created_by; $cancelled_dispensation->previous_created_at = $dispensation->created_at; $cancelled_dispensation->created_by = Auth::id(); $cancelled_dispensation->save(); $treatment = Treatment::find($dispensation->treatment_id); $treatment->dispense_status = 0; $treatment->update(); // fill back the drug quantities $drug_ids_array = explode(",", $dispensation->drugs); $quantity_to_dispense_array = explode(",", $dispensation->quantity_dispensed); if ($dispensation->purchased_elsewhere) { $purchased_elsewhere_array = explode(",", $dispensation->purchased_elsewhere); } else { $purchased_elsewhere_array = array_fill(0, count($drug_ids_array), 0); } for ($x = 0; $x < count($drug_ids_array); $x++) { $drug = Drug::find($drug_ids_array[$x]); if ($drug && $purchased_elsewhere_array[$x] == 0) { $current_stock = $drug->pharmacy_stock; $new_stock = $current_stock + $quantity_to_dispense_array[$x]; $drug->pharmacy_stock = $new_stock; $drug->update(); //reverse the used batches too reverse_dispensed_item_batches(1, $drug_ids_array[$x], $quantity_to_dispense_array[$x], $dispensation->patient_id, 'treatments', $treatment->id); } } $dispensation->forceDelete(); flash('Patient dispensation has been cancelled!')->success(); return redirect('pharmacy_dispensation_report_patients'); } public function pharmacy_dispensation_report_drugs(Request $request) { $search_text = ""; $filters = []; $selected_drug_id = $request->drug_id; /* create associative array of drugs with their quantities */ $drugs_qty_associative_array = []; if($request->search_by == 0){ // last 24 hours array_push($filters, ['created_at', '>', Carbon::now()->subDay()]); $search_text = "Showing dispensations in the past 24 hours"; } elseif($request->search_by == 1){ // custom date $start_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->reg_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); $search_text = "Showing dispensations made between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } elseif($request->search_by == 2){ // custom date range $start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); $search_text = "Showing dispensations made between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } else { // last 24 hours array_push($filters, ['created_at', '>', Carbon::now()->subDay()]); $search_text = "Showing dispensations in the past 24 hours"; } $drugs_selection_array = Drug::where('available', 1)->pluck("name","id")->toArray(); $drugs_selection_array = ['' => '- select -'] + $drugs_selection_array; $drugs_dispensed_with_qty_array = []; $opd_drugs_dispensed_with_qty_array = []; $ipd_drugs_dispensed_with_qty_array = []; $drugs_dispensed = []; $quantity_dispensed = []; $opd_dispensations = PatientDispensing::where($filters)->get(); if (count($opd_dispensations) > 0) { foreach ($opd_dispensations as $opd_record) { $drugs_array = explode(",", $opd_record->drugs); $quantities_array = explode(",", $opd_record->quantity_dispensed); $purchased_elsewhere_array = explode(",", $opd_record->purchased_elsewhere); for ($i=0; $i < count($drugs_array); $i++) { if (isset($purchased_elsewhere_array[$i]) && $purchased_elsewhere_array[$i] == 0) { if (!is_null($selected_drug_id)) { if ($selected_drug_id == $drugs_array[$i]) { /* ============ meet Ms.Elegant for the first date with opd stuff ==========*/ if (array_key_exists($drugs_array[$i], $drugs_qty_associative_array)){ //echo "Found the Key"; $drugs_qty_associative_array[$drugs_array[$i]] += $quantities_array[$i]; } else{ //echo "Key not Found"; $drugs_qty_associative_array[$drugs_array[$i]] = $quantities_array[$i]; } /*============ bye bye Ms.Elegant ========*/ /* ============ meet Ms.Elegant's little sister ==========*/ if (array_key_exists($drugs_array[$i], $opd_drugs_dispensed_with_qty_array)){ //echo "Found the Key"; $opd_drugs_dispensed_with_qty_array[$drugs_array[$i]] += $quantities_array[$i]; } else{ //echo "Key not Found"; $opd_drugs_dispensed_with_qty_array[$drugs_array[$i]] = $quantities_array[$i]; } /*============ bye bye Ms.Elegant's little sister ========*/ } } else{ /* ============ meet Ms.Elegant for the first date with opd stuff ==========*/ if (array_key_exists($drugs_array[$i], $drugs_qty_associative_array)){ //echo "Found the Key"; $drugs_qty_associative_array[$drugs_array[$i]] += $quantities_array[$i]; } else{ //echo "Key not Found"; $drugs_qty_associative_array[$drugs_array[$i]] = $quantities_array[$i]; } /*============ bye bye Ms.Elegant ========*/ /* ============ meet Ms.Elegant's little sister ==========*/ if (array_key_exists($drugs_array[$i], $opd_drugs_dispensed_with_qty_array)){ //echo "Found the Key"; $opd_drugs_dispensed_with_qty_array[$drugs_array[$i]] += $quantities_array[$i]; } else{ //echo "Key not Found"; $opd_drugs_dispensed_with_qty_array[$drugs_array[$i]] = $quantities_array[$i]; } /*============ bye bye Ms.Elegant's little sister ========*/ } } } } } $ward_quantities = []; $ward_dispensed_drugs = []; if (!is_null($selected_drug_id)) { $ward_dispensations = WardTreatmentDispensation::where($filters)->where('drug_id', $selected_drug_id)->get(); } else { //selected_drug_id $ward_dispensations = WardTreatmentDispensation::where($filters)->get(); } if (count($ward_dispensations) > 0) { foreach ($ward_dispensations as $ward_record) { /* ============ meet Ms.Elegant for the second date with ward stuff ==========*/ if (array_key_exists($ward_record->drug_id, $drugs_qty_associative_array)){ //echo "Found the Key"; $drugs_qty_associative_array[$ward_record->drug_id] += $ward_record->quantity_given; } else{ //echo "Key not Found"; $drugs_qty_associative_array[$ward_record->drug_id] = $ward_record->quantity_given; } /*============ bye bye Ms.Elegant ========*/ /* ============ meet Ms.Elegant's other little sister ==========*/ if (array_key_exists($ward_record->drug_id, $ipd_drugs_dispensed_with_qty_array)){ //echo "Found the Key"; $ipd_drugs_dispensed_with_qty_array[$ward_record->drug_id] += $ward_record->quantity_given; } else{ //echo "Key not Found"; $ipd_drugs_dispensed_with_qty_array[$ward_record->drug_id] = $ward_record->quantity_given; } /*============ bye bye Ms.Elegant's other little sister ========*/ } } return view('pharmacy::pharmacy.pharmacy_dispensation_report_drugs', compact('drugs_selection_array', 'drugs_dispensed', 'quantity_dispensed', 'ward_quantities', 'ward_dispensed_drugs', 'drugs_qty_associative_array', 'search_text', 'opd_drugs_dispensed_with_qty_array', 'ipd_drugs_dispensed_with_qty_array', 'request')); } public function dispensation_report_details(Request $request) { $search_text = ""; $filters = []; /* create associative array of drugs with their quantities */ $drugs_qty_associative_array = []; $selected_drug_id = $request->details_drug_id; if($request->details_search_by == 0){ // last 24 hours array_push($filters, ['created_at', '>', Carbon::now()->subDay()]); $search_text = "Showing dispensations in the past 24 hours"; } elseif($request->details_search_by == 1){ // custom date $start_date = Carbon::createFromFormat('d/m/Y', $request->details_reg_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->details_reg_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); $search_text = "Showing dispensations made between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } elseif($request->details_search_by == 2){ // custom date range $start_date = Carbon::createFromFormat('d/m/Y', $request->details_start_date)->startOfDay()->toDateTimeString(); $end_date = Carbon::createFromFormat('d/m/Y', $request->details_end_date)->endOfDay()->toDateTimeString(); array_push($filters, ['created_at', '>', $start_date]); array_push($filters, ['created_at', '<', $end_date]); $search_text = "Showing dispensations made between " . streamline_date_plain($start_date) . " and " . streamline_date_plain($end_date); } else { // last 24 hours array_push($filters, ['created_at', '>', Carbon::now()->subDay()]); $search_text = "Showing dispensations in the past 24 hours"; } $drugs_array = Drug::pluck("name","id")->toArray(); $drugs_array = ['' => '- select -'] + $drugs_array; $drugs_dispensed_with_qty_array = []; $opd_drugs_dispensed_with_qty_array = []; $ipd_drugs_dispensed_with_qty_array = []; $drugs_dispensed = []; $quantity_dispensed = []; $opd_dispensations = PatientDispensing::where($filters)->get(); if (count($opd_dispensations) > 0) { foreach ($opd_dispensations as $opd_record) { $drugs_array = explode(",", $opd_record->drugs); $quantities_array = explode(",", $opd_record->quantity_dispensed); $purchased_elsewhere_array = explode(",", $opd_record->purchased_elsewhere); for ($i=0; $i < count($drugs_array); $i++) { if (isset($purchased_elsewhere_array[$i]) && $purchased_elsewhere_array[$i] == 0) { /* ============ meet Ms.Elegant for the first date with opd stuff ==========*/ if (array_key_exists($drugs_array[$i], $drugs_qty_associative_array)){ //echo "Found the Key"; $drugs_qty_associative_array[$drugs_array[$i]] += $quantities_array[$i]; } else{ //echo "Key not Found"; $drugs_qty_associative_array[$drugs_array[$i]] = $quantities_array[$i]; } /*============ bye bye Ms.Elegant ========*/ /* ============ meet Ms.Elegant's little sister ==========*/ if (array_key_exists($drugs_array[$i], $opd_drugs_dispensed_with_qty_array)){ //echo "Found the Key"; $opd_drugs_dispensed_with_qty_array[$drugs_array[$i]] += $quantities_array[$i]; } else{ //echo "Key not Found"; $opd_drugs_dispensed_with_qty_array[$drugs_array[$i]] = $quantities_array[$i]; } /*============ bye bye Ms.Elegant's little sister ========*/ } } } } $ward_dispensations = WardTreatmentDispensation::where($filters)->where('drug_id', $selected_drug_id)->get(); return view('pharmacy::pharmacy.dispensation_report_details', compact('search_text', 'ward_dispensations', 'selected_drug_id', 'opd_dispensations')); } public function dispensed_details_review(Request $request) { $treatment_id = $request->treatment_id; $patient_id = $request->patient_id; $episode_id = $request->episode_id; $patient = Patient::where(['id' => $patient_id])->first(); $categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id"); $marital_statuses = DB::table('marital_statuses')->pluck("name", "id"); $drug_categories = DB::table('drug_categories')->get(); $treatment = Treatment::find($treatment_id); //$treatments = Treatment::where(['episode_id' => $episode_id, 'dispense_status' => 0])->get(); $dosage_frequencies = DB::table('dosage_frequencies')->pluck("name", "id")->toArray(); //allergies and alerts $known_patient_allergies = Allergy::where('patient_id', $patient_id)->orderBy('created_at', 'desc')->take(2)->get(); $known_patient_alerts = Alert::where('patient_id', $patient_id)->orderBy('created_at', 'desc')->take(2)->get(); $drug_categories_array = DB::table('drug_categories')->pluck('name', 'id'); return view('pharmacy::pharmacy.dispensed_details_review', compact('patient_id', 'treatment_id', 'patient', 'categories', 'marital_statuses', 'drug_categories', 'treatment', 'known_patient_alerts', 'known_patient_allergies', 'drug_categories_array','dosage_frequencies')); } public function view_prescriptions_to_cancel(Request $request) { $search_by = $request->search_by; $reg_date = $request->reg_date; $start_date = $request->start_date; $end_date = $request->end_date; $filters = []; if($search_by == 0){ // last 24 hours $start_date_search = Carbon::now()->subDay(); $end_date_search = Carbon::now(); $date_search = "Today"; } elseif($search_by == 1){ // custom date $start_date_search = Carbon::parse($reg_date)->startOfDay(); $end_date_search = Carbon::parse($reg_date)->endOfDay(); $date_search = streamline_date($start_date_search); } elseif($search_by == 2){ // custom date range $start_date_search = Carbon::parse($start_date)->startOfDay(); $end_date_search = Carbon::parse($end_date)->endOfDay(); $date_search = streamline_date($start_date_search) . " to " . streamline_date($end_date_search); } $prescriptions = Treatment::where('dispense_status', 0) ->where('payment_status', 0) ->whereBetween('created_at', [$start_date_search, $end_date_search]) ->orderBy('id','desc') ->get(); return view('pharmacy::pharmacy.view_prescriptions_to_cancel',compact('prescriptions', 'date_search')); } public function cancel_prescriptions($treatment_id) { $treatment = Treatment::find($treatment_id); try { $treatment->delete(); // check if there are any insurance claims available $claim = InsuranceClaim::where('order_id', $treatment_id)->where('item_type', 4)->first(); if ($claim) { $claim->delete(); } flash("Treatment order has been cancelled.")->success(); } catch (\Exception $exception) { flash("Treatment order has not been cancelled.")->error(); } return redirect('/pharmacy/view_prescriptions_to_cancel'); } public function view_cancelled_prescriptions(Request $request) { $search_by = $request->search_by; $reg_date = $request->reg_date; $start_date = $request->start_date; $end_date = $request->end_date; $filters = []; if($search_by == 0){ // last 24 hours $start_date_search = Carbon::now()->subDay(); $end_date_search = Carbon::now(); $date_search = "Today"; } elseif($search_by == 1){ // custom date $start_date_search = Carbon::parse($reg_date)->startOfDay(); $end_date_search = Carbon::parse($reg_date)->endOfDay(); $date_search = streamline_date($start_date_search); } elseif($search_by == 2){ // custom date range $start_date_search = Carbon::parse($start_date)->startOfDay(); $end_date_search = Carbon::parse($end_date)->endOfDay(); $date_search = streamline_date($start_date_search) . " to " . streamline_date($end_date_search); } $prescriptions = DB::table('treatments') ->whereNotNull('deleted_at') ->whereBetween('deleted_at', [$start_date_search, $end_date_search]) ->orderBy('id','desc') ->get(); return view('pharmacy::pharmacy.view_cancelled_prescriptions',compact('prescriptions', 'date_search')); } public function restore_deleted_ordered_treatments($id) { $treatment = Treatment::withTrashed()->find($id); try { $treatment->restore(); // check if there are any insurance claims available $claim = InsuranceClaim::onlyTrashed()->where('order_id', $id)->where('service_type', 4)->first(); if ($claim) { $claim->restore(); } flash("Treatment order has been activated")->success(); } catch (\Exception $exception) { flash("Treatment order has not been activated")->error(); } return redirect('/pharmacy/view_cancelled_prescriptions'); } public function dispense_treatment_progressively($treatment_id) { $treatment = Treatment::find($treatment_id); $treatment_opd = new TreatmentOpdProgressive(); $treatment_opd->patient_id = $treatment->patient_id; $treatment_opd->episode_id = $treatment->episode_id; $treatment_opd->initial_treatment_id = $treatment->id; $treatment_opd->treatment_ids = $treatment->id; $treatment_opd->is_first_treatment_given = 0; $treatment_opd->drugs = $treatment->drugs; $treatment_opd->dose = $treatment->doses; $treatment_opd->drug_frequency = $treatment->frequencies; $treatment_opd->durations = $treatment->durations; $treatment_opd->quantities_to_dispense = $treatment->quantities_dispensed; $treatment_opd->instruction = $treatment->instruction; $treatment_opd->created_by = Auth::id(); $treatment_opd->prescribed_by = $treatment->created_by; $treatment_opd->order_comments = $treatment->order_comments; $treatment_opd->save(); $treatment->confirmation_status = 1; $treatment->is_treatment_progressive = $treatment_opd->id; $treatment->save(); flash('Treatment has been confirmed and progressive dispensation started')->success(); return redirect('confirm_prescriptions'); } public function confirm_progressive_prescriptions(Request $request) { $today = Carbon::today(); $yesterday = Carbon::yesterday(); $categories = DB::table('patient_categories')->where('available', 1)->pluck("name", "id"); $display = dateLabelSetter2($request); $filters = []; if (isset($request->patient_id) && $request->patient_id != 0) { array_push($filters, ['patient_id', '=', $request->patient_id]); } switch ($request->dates){ case 'today': default: $end = Carbon::parse($today)->endOfDay(); $start = Carbon::parse($today)->startOfDay(); break; case 'yesterday': $end = Carbon::parse($yesterday)->endOfDay(); $start = Carbon::parse($yesterday)->startOfDay(); break; case 'custom_date': $end = Carbon::parse($request->start)->endOfDay(); $start = Carbon::parse($request->start_date)->startOfDay(); break; case 'custom_date_range': $end = Carbon::parse($request->end_date)->endOfDay(); $start = Carbon::parse($request->start_date)->startOfDay(); } $prescriptions = TreatmentOpdProgressive::where('is_dispensation_complete', 0) ->whereBetween('created_at',[$start, $end]) ->where($filters) ->orderBy('created_at', 'desc') ->get(); return view('pharmacy::pharmacy.confirm_progressive_prescriptions', compact('prescriptions', 'categories', 'display')); } public function confirm_progressive_prescriptions_details($treatment_id) { $original_prescription = TreatmentOpdProgressive::find($treatment_id); $patient_id = $original_prescription->patient_id; if ($original_prescription->is_first_treatment_given != 0) { $previous_progressive_treatments = Treatment::whereIn('id', explode(",", $original_prescription->treatment_ids))->get(); } else { $previous_progressive_treatments = []; } $patient = Patient::find($patient_id); return view('pharmacy::pharmacy.confirm_progressive_prescriptions_details', compact('previous_progressive_treatments', 'original_prescription', 'patient', 'patient_id')); } public function save_progressive_prescriptions(Request $request) { $duration_array = $request->duration; $patient_id = $request->patient_id; $episode_id = $request->episode_id; $time_duration = []; $is_first_treatment = false; $quantity_given_so_far = $request->quantity_given_so_far; $quantity_prescribed = $request->quantity_prescribed; $quantity_dispensed = $request->quantity_dispensed; $is_treatment_done = array_fill(0, count($duration_array), false); $original_prescription = TreatmentOpdProgressive::find($request->progressive_id); // check if this is the first time a progressive prescription is made to update it if ($original_prescription->is_first_treatment_given == 0) { $treatment = Treatment::find($original_prescription->initial_treatment_id); if ($treatment->dispense_status == 1) { // if the treatment has been dispensed then lock the record $original_prescription->is_dispensation_complete = 1; $original_prescription->save(); flash("The treatment order for " . get_patient_name($patient_id) . " has already been dispensed!")->error(); return redirect("/confirm_progressive_prescriptions"); } $treatment->updated_by = Auth::id(); $original_prescription->is_first_treatment_given = 1; $original_prescription->payment_status = $treatment->payment_status; $is_first_treatment = true; } else { $treatment = new Treatment; $treatment->created_by = Auth::id(); $treatment->payment_status = $original_prescription->payment_status; } // sort the durations by adding days string for ($i = 0; $i < count($duration_array); $i++) { $time_duration[] = $duration_array[$i] . " Days"; $is_treatment_done[$i] = (($quantity_given_so_far[$i] + $quantity_dispensed[$i]) > ($quantity_prescribed[$i] - 1)); } // insert treatment details with confirmation and progressive $treatment->patient_id = $patient_id; $treatment->episode_id = $episode_id; $treatment->drugs = implode(',', $request->drug_id); $treatment->doses = implode(',', $request->dose); $treatment->frequencies = implode(',', $request->frequency); $treatment->durations = implode(',', $time_duration); $treatment->quantities_dispensed = implode(',', $request->quantity_dispensed); $treatment->instruction = implode(',', $request->instructions); $treatment->confirmation_status = 1; $treatment->is_treatment_progressive = $request->progressive_id; if ($treatment->save()) { // redo the insurance claim for treatment if it exists if ($request->patient_insurance_status == 1) { generate_insurance_claim($treatment->id, 4); } // group the treatment ids $current_treatment_ids = explode(",", $original_prescription->treatment_ids); // avoid repeating the first id if (!$is_first_treatment) { $current_treatment_ids[] = $treatment->id; } // check if all medicine in the original prescription has been dispensed and close this record if (!in_array(false, $is_treatment_done)) { $original_prescription->is_dispensation_complete = 1; } $original_prescription->treatment_ids = implode(",", $current_treatment_ids); $original_prescription->save(); flash("New treatment record has been created")->success(); } else { flash("Failed to create a new treatment record")->error(); } return redirect("/confirm_progressive_prescriptions"); } public function cancel_progressive_prescriptions($treatment_id) { $treatment = TreatmentOpdProgressive::find($treatment_id); if ($treatment->delete()) { flash("Progressive treatment order has been cancelled.")->success(); return redirect('/confirm_progressive_prescriptions'); } } public function view_cancelled_progressive_prescriptions(Request $request) { $search_by = $request->search_by; $reg_date = $request->reg_date; $start_date = $request->start_date; $end_date = $request->end_date; $filters = []; if($search_by == 0){ // last 24 hours $start_date_search = Carbon::now()->subDay(); $end_date_search = Carbon::now(); $date_search = "Today"; } elseif($search_by == 1){ // custom date $start_date_search = Carbon::parse($reg_date)->startOfDay(); $end_date_search = Carbon::parse($reg_date)->endOfDay(); $date_search = streamline_date($start_date_search); } elseif($search_by == 2){ // custom date range $start_date_search = Carbon::parse($start_date)->startOfDay(); $end_date_search = Carbon::parse($end_date)->endOfDay(); $date_search = streamline_date($start_date_search) . " to " . streamline_date($end_date_search); } $prescriptions = DB::table('treatments_opd_progressive') ->whereNotNull('deleted_at') ->whereBetween('deleted_at', [$start_date_search, $end_date_search]) ->orderBy('id','desc') ->get(); return view('pharmacy::pharmacy.view_cancelled_progressive_prescriptions',compact('prescriptions', 'date_search')); } public function restore_deleted_progressive_prescriptions($id) { $treatment = TreatmentOpdProgressive::withTrashed()->find($id); if ($treatment->restore()){ flash("Progressive treatment order has been activated.")->success(); return redirect('/pharmacy/view_cancelled_progressive_prescriptions'); } } public function delete_requisition($id) { $requisition = Requisition::find($id); if ($requisition && $requisition->delete()) { flash("Requisition has been deleted")->success(); } else { flash("Unable to delete requisition. Please contact the Stre@mline Support team")->error(); } return redirect()->back(); } public function delete_temporary_requisition($id) { $temporary_requisition = TemporaryRequisition::find($id); // confirm the temp exists if ($temporary_requisition && $temporary_requisition->delete()) { flash("Requisition has been deleted")->success(); } else { flash("Unable to delete requisition. Please contact the Stre@mline Support team")->error(); } return redirect()->back(); } public function item_requisition_print($requisition_id, $item_type) { $hospital_details = HospitalInformation::first(); $requisition_model = Requisition::withTrashed()->find($requisition_id); $data = [ 'hospitalInfo' => $hospital_details, 'requisition_model' => $requisition_model, 'requisition_id' => $requisition_id, 'item_type' => $item_type ]; $pdf = SnappyPDF::loadView('pharmacy::pharmacy/item_requisition_print', $data) ->setOrientation('portrait') ->setOption('margin-bottom', 10) ->setOption('margin-top', 5) ->setOption('margin-left', 2) ->setOption('margin-right', 2) ->setOption('footer-font-size', 10) ->setOption('footer-html', '- Stre@mline - '. get_full_name(Auth::id(), "id", "first_name", "last_name", "users") .' '.streamline_date_time(date('Y-m-d')).''); return $pdf->inline('ITEMS BILL' . date(" d-m-y h:ia") . '.pdf'); } public function sundries_stock_reconciliation(Request $request) { $sundries = []; $item_ids_array = $request->search_items_ids; if ($item_ids_array) { $is_all_items = in_array("all_items", $item_ids_array); if ($is_all_items) { $sundries = Sundry::where('available', 1)->orderby('name', 'asc')->get(); } else{ $sundries = Sundry::whereIn('id', $item_ids_array)->orderBy('name', 'asc')->get(); } } $chart_of_accounts = ChartOfAccount::orderBy('name', 'asc')->pluck('name', 'id')->toArray(); $chart_of_accounts = ['' => '- select -'] + $chart_of_accounts; $sundries_dropdown = DB::table('sundries')->whereNull('deleted_at')->orderBy('name', 'asc')->pluck('name','id')->prepend('All sundries', 'all_items')->toArray(); $stock_adjustment_chart_of_account = ChartOfAccount::where('slug', 'stock_adjustment')->first(); return view('pharmacy::pharmacy.sundries_stock_reconciliation', compact('sundries', 'chart_of_accounts', 'sundries_dropdown', 'stock_adjustment_chart_of_account')); } public function store_pharmacy_sundries_stock_count(Request $request) { $sundries_ids_array = $request->sundry_id; $cost_price_array = $request->cost_price; $system_stock_array = $request->system_stock; $physical_stock_array = $request->physical_stock; $difference_array = $request->difference; $expiry_date_array = $request->expiry_date; $reason_for_difference_array = $request->reason_for_difference; $batch_sundry_ids_array = $request->batch_sundry_id; $unique_sundry_ids_with_batches_array = array_unique($batch_sundry_ids_array); $batch_numbers_array = $request->batch_number; $batch_quantity_balances_array = $request->batch_quantity_balance; $batch_expiry_dates_array = $request->expiry_date; $batch_unit_cost= $request->batch_unit_cost; $batch_db_record_ids_array = $request->item_batch_watcher_id; $batch_unit_cost= $request->batch_unit_cost; $sundries_with_initial_stock_array = is_null($request->is_initial_stock) ? [] : $request->is_initial_stock; $stock_adjustment_chart_of_account = ChartOfAccount::where('slug', 'stock_adjustment')->first(); $affected_account_id = $stock_adjustment_chart_of_account->id; $opening_inventory_chart_of_account = ChartOfAccount::where('slug', 'opening_inventory')->first(); //$affected_account_id = $request->account_id; //get the max identfier $max_stock_count_identifier = DB::table('pharmacy_sundry_stock_reconciliations')->max('stock_count_identifier'); $reconcile_sundry_pharmacy_stock = true; //update batch tracking tables with reconciliations for ($i=0; $i < count($batch_numbers_array) ; $i++) { if (!is_null($batch_numbers_array[$i]) && !is_null($batch_quantity_balances_array[$i])) { //enforce double entry per batch if (in_array($batch_sundry_ids_array[$i], $sundries_with_initial_stock_array)) { $affected_account_id = $opening_inventory_chart_of_account->id;//override adjustment a/c to be opening_inv } else{ $affected_account_id = $stock_adjustment_chart_of_account->id; } account_for_batch_reconciliations_difference($item_type = 2, $batch_sundry_ids_array[$i], $affected_account_id, $batch_numbers_array[$i], $batch_quantity_balances_array[$i], $request->reconciliation_date, "pharmacy", $ward_id = null); reconcile_batches($item_type = 2, $batch_sundry_ids_array[$i], $batch_numbers_array[$i], $batch_quantity_balances_array[$i], $batch_expiry_dates_array[$i], "pharmacy", $batch_unit_cost[$i]??0, $batch_db_record_ids_array[$i]??0, $ward_id=null); } } if (isset($request->reconcile_stock)) { for ($x = 0; $x < count($sundries_ids_array); $x++): /* check if the difference value is not null and then update the sundry */ if (!is_null($difference_array[$x])) { $physical_stock = new PharmacySundryStockReconciliation; $physical_stock->sundry_id = $sundries_ids_array[$x]; $physical_stock->system_stock = $system_stock_array[$x]; $physical_stock->physical_stock = $physical_stock_array[$x]; $physical_stock->difference = $difference_array[$x]; $physical_stock->reason_for_difference = $reason_for_difference_array[$x]; $physical_stock->completion_status = 1; $physical_stock->affected_account_id = $affected_account_id; $physical_stock->reconciliation_date = $request->reconciliation_date; $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 = PharmacySundryStockReconciliation::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(); //update the system stock levels with the newly counted physical stock //update only those with new physical value $sundry = Sundry::find($sundries_ids_array[$x]); $sundry->pharmacy_stock = $physical_stock_array[$x]; $sundry->expiry_date = $expiry_date_array[$x]; if (in_array($sundry->id, $sundries_with_initial_stock_array)) { $existing_opening_stock = is_null($sundry->opening_stock) ? 0 : $sundry->opening_stock; $sundry->opening_stock = $existing_opening_stock + $physical_stock_array[$x]; $sundry->opening_cost_price = $cost_price_array[$x]; $sundry->opening_stock_date = $request->reconciliation_date; $sundry->pharmacy_opening_stock = $physical_stock_array[$x]; $affected_account_id = $opening_inventory_chart_of_account->id;//overide adjustment a/c to be opening_inv } else{ $affected_account_id = $stock_adjustment_chart_of_account->id; } $sundry->updated_by = Auth::id(); //enforce double entry account_for_stock_reconciliations_difference($item_type = 2, $sundries_ids_array[$x], $affected_account_id, $difference_array[$x], $cost_price_array[$x], $request->reconciliation_date); $reconcile_drug_pharmacy_stock = $sundry->update(); }else $reconcile_drug_pharmacy_stock = true; endfor; if ($reconcile_drug_pharmacy_stock): flash('Stock levels have been reconciled')->success(); return redirect('pharmacy_sundries_stock_sheet'); endif; } else if(isset($request->save_stock)){ //save these for editing later on for ($x = 0; $x < count($sundries_ids_array); $x++): $physical_stock = new PharmacySundryStockReconciliation; $physical_stock->sundry_id = $sundries_ids_array[$x]; $physical_stock->system_stock = $system_stock_array[$x]; $physical_stock->physical_stock = $physical_stock_array[$x]; $physical_stock->difference = $difference_array[$x]; $physical_stock->reason_for_difference = $reason_for_difference_array[$x]; $physical_stock->completion_status = 0; $physical_stock->created_by = Auth::id(); $saved_physical_stock = $physical_stock->save(); //add stock_count_identifier that will be used in resuming edit $physical_stock_record_to_that_will_be_updated = PharmacySundryStockReconciliation::find($physical_stock->id); $physical_stock_record_to_that_will_be_updated->stock_count_identifier = $max_stock_count_identifier+1;//increase ID by 1 for new $physical_stock_record_to_that_will_be_updated->update(); endfor; if ($saved_physical_stock): flash('Physical stock has been saved. You can resume later')->success(); return redirect('pharmacy_sundries_stock_sheet'); endif; } flash('Sorry, unable to update stock')->error(); return redirect()->back(); } public function sundries_stock_reconciliation_report(Request $request) { if (!empty($request->dates)) { if ($request->dates == "today") { $today = Carbon::today()->startOfDay()->toDateTimeString(); $end = Carbon::parse($today)->endOfDay()->toDateTimeString(); $reconciled_stocks = PharmacySundryStockReconciliation::groupBy("stock_count_identifier")->whereBetween('created_at', [$today, $end])->orderBy('stock_count_identifier', 'desc')->get(); } else if ($request->dates == "yesterday") { $yesterday = Carbon::yesterday()->startOfDay()->toDateTimeString(); $end = Carbon::parse($yesterday)->endOfDay()->toDateTimeString(); $reconciled_stocks = PharmacySundryStockReconciliation::groupBy("stock_count_identifier")->whereBetween('created_at', [$yesterday, $end])->orderBy('stock_count_identifier', 'desc')->get(); } else if ($request->dates == "custom_date") { $start = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString(); $end = Carbon::parse($request->start_date)->endOfDay()->toDateTimeString(); $reconciled_stocks = PharmacySundryStockReconciliation::groupBy("stock_count_identifier")->whereBetween('created_at', [$start, $end])->orderBy('stock_count_identifier', 'desc')->get(); } else if ($request->dates == "custom_date_range") { $start = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString(); $end = Carbon::parse($request->end_date)->endOfDay()->toDateTimeString(); $reconciled_stocks = PharmacySundryStockReconciliation::groupBy("stock_count_identifier")->whereBetween('created_at', [$start, $end])->orderBy('stock_count_identifier', 'desc')->get(); } } else $reconciled_stocks = PharmacySundryStockReconciliation::groupBy("stock_count_identifier")->orderBy('stock_count_identifier', 'desc')->get(); return view('pharmacy::pharmacy.sundries_stock_reconciliation_report',compact('reconciled_stocks')); } public function opticals_stock_reconciliation_report(Request $request) { if (!empty($request->dates)) { if ($request->dates == "today") { $today = Carbon::today()->startOfDay()->toDateTimeString(); $end = Carbon::parse($today)->endOfDay()->toDateTimeString(); $reconciled_stocks = OpticalStockReconciliation::select('stock_count_identifier', 'created_by', 'created_at', 'general_comment', DB::raw('SUM(variance) as total'))->groupBy('stock_count_identifier', 'created_by', 'created_at', 'general_comment')->where('type',1)->whereBetween('created_at', [$today, $end])->orderBy('stock_count_identifier', 'desc')->get(); } else if ($request->dates == "yesterday") { $yesterday = Carbon::yesterday()->startOfDay()->toDateTimeString(); $end = Carbon::parse($yesterday)->endOfDay()->toDateTimeString(); $reconciled_stocks = OpticalStockReconciliation::select('stock_count_identifier', 'created_by', 'created_at', 'general_comment', DB::raw('SUM(variance) as total'))->groupBy('stock_count_identifier', 'created_by', 'created_at', 'general_comment')->where('type',1)->whereBetween('created_at', [$yesterday, $end])->orderBy('stock_count_identifier', 'desc')->get(); } else if ($request->dates == "custom_date") { $start = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString(); $end = Carbon::parse($request->start_date)->endOfDay()->toDateTimeString(); $reconciled_stocks = OpticalStockReconciliation::select('stock_count_identifier', 'created_by', 'created_at', 'general_comment', DB::raw('SUM(variance) as total'))->groupBy('stock_count_identifier', 'created_by', 'created_at', 'general_comment')->where('type',1)->whereBetween('created_at', [$start, $end])->orderBy('stock_count_identifier', 'desc')->get(); } else if ($request->dates == "custom_date_range") { $start = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString(); $end = Carbon::parse($request->end_date)->endOfDay()->toDateTimeString(); $reconciled_stocks = OpticalStockReconciliation::select('stock_count_identifier', 'created_by', 'created_at', 'general_comment', DB::raw('SUM(variance) as total'))->groupBy('stock_count_identifier', 'created_by', 'created_at', 'general_comment')->where('type',1)->whereBetween('created_at', [$start, $end])->orderBy('stock_count_identifier', 'desc')->get(); } } else $reconciled_stocks = OpticalStockReconciliation::select('stock_count_identifier', 'created_by', 'created_at', 'general_comment', DB::raw('SUM(variance) as total'))->where('type',1)->groupBy('stock_count_identifier', 'created_by', 'created_at', 'general_comment')->orderBy('stock_count_identifier', 'desc')->get(); return view('pharmacy::pharmacy.opticals_stock_reconciliation_report',compact('reconciled_stocks')); } public function opticals_stock_reconciliation_report_details(Request $request) { $opticals_reconciled = OpticalStockReconciliation::where(['stock_count_identifier' => $request->stock_count_identifier])->get(); $opticals_reconciled = $this->itemService->processReconcileItems($opticals_reconciled); return view('pharmacy::pharmacy.opticals_stock_reconciliation_report_print', compact('opticals_reconciled')); } /* stock reconciliation report details */ public function sundries_stock_reconciliation_report_details(Request $request) { $sundries_reconciled = PharmacySundryStockReconciliation::where(['stock_count_identifier' => $request->stock_count_identifier])->get(); return view('pharmacy::pharmacy.sundries_stock_reconciliation_report_details',compact('sundries_reconciled')); } public function print_protocol_ward_chart() { $request_array = session()->get('request_array'); $protocol_ward_id_arr = $request_array['protocol_ward_id']; $protocol_patient_id_arr = $request_array['protocol_patient_id']; $protocol_episode_id_arr = $request_array['protocol_episode_id']; $protocol_drug_dose_arr = $request_array['protocol_drug_dose']; $protocol_dosage_to_dispense_arr = $request_array['protocol_dosage_to_dispense']; $protocol_quantity_to_dispense_arr = $request_array['protocol_quantity_to_dispense']; $protocol_instruction_arr = $request_array['protocol_instruction']; $protocol_drug_ids_arr = $request_array['protocol_drug_ids']; $protocol_drug_dose_label_arr = $request_array['protocol_drug_dose_label']; session()->forget('request_array'); $hospital_details = HospitalInformation::find(1); $wards = DB::table('wards')->whereNull('deleted_at')->pluck('name', 'id')->toArray(); return view('pharmacy::pharmacy.print_protocol_ward_chart', compact('protocol_ward_id_arr', 'protocol_patient_id_arr', 'protocol_episode_id_arr', 'protocol_drug_dose_arr', 'protocol_dosage_to_dispense_arr', 'wards', 'protocol_quantity_to_dispense_arr', 'protocol_instruction_arr', 'protocol_drug_ids_arr', 'hospital_details', 'protocol_drug_dose_label_arr')); } public function optical_stock_reconciliation(Request $request) { $optics = []; $item_ids_array = $request->search_items_ids; if ($item_ids_array) { $is_all_items = in_array("all_items", $item_ids_array); if ($is_all_items) { $optics = EyeGlasses::orderBy('name', 'asc')->get(); } else{ $optics = EyeGlasses::whereIn('id', $item_ids_array)->orderBy('name', 'asc')->get(); } } $chart_of_accounts = ChartOfAccount::orderBy('name', 'asc')->pluck('name', 'id')->toArray(); $chart_of_accounts = ['' => '- select -'] + $chart_of_accounts; $optic_dropdown = DB::table('eye_glasses')->whereNull('deleted_at')->orderBy('name', 'asc')->pluck('name','id')->prepend('All Optical Items', 'all_items')->toArray(); $reasons = $this->itemService->getAllReconciliationReasonsArray(); $stock_adjustment_chart_of_account = ChartOfAccount::where('slug', 'stock_adjustment')->first(); return view('pharmacy::pharmacy.optical_stock_reconciliation', compact('optics','reasons', 'chart_of_accounts', 'optic_dropdown', 'stock_adjustment_chart_of_account')); } public function store_pharmacy_optical_stock_count(Request $request) { $item_ids_array = $request->drug_id; $cost_price_array = $request->cost_price; $system_stock_array = $request->system_stock; $physical_stock_array = $request->physical_stock; $difference_array = $request->difference; $reason_for_difference_array = $request->reason_for_difference; $difference_in_cost_value_array=$request->difference_in_cost_value; $batch_sundry_ids_array = $request->batch_drug_id; $unique_sundry_ids_with_batches_array = array_unique($batch_sundry_ids_array); $batch_numbers_array = $request->batch_number; $batch_quantity_balances_array = $request->batch_quantity_balance; $batch_expiry_dates_array = $request->expiry_date; $batch_unit_cost= $request->batch_unit_cost; $batch_db_record_ids_array = $request->item_batch_watcher_id; $reconciliation_date=Carbon::createFromFormat('d/m/Y', $request->reconciliation_date)->toDateString(); $batch_reason_array = $request->reconcile_reason; $sundries_with_initial_stock_array = is_null($request->is_initial_stock) ? [] : $request->is_initial_stock; $stock_adjustment_chart_of_account = ChartOfAccount::where('slug', 'stock_adjustment')->first(); $affected_account_id = $stock_adjustment_chart_of_account->id; $opening_inventory_chart_of_account = ChartOfAccount::where('slug', 'opening_inventory')->first(); $batches =[]; //get the max identfier $max_stock_count_identifier = OpticalStockReconciliation::max('stock_count_identifier'); $reconcile_optical_pharmacy_stock = true; //update batch tracking tables with reconciliations for ($i=0; $i < count($batch_numbers_array) ; $i++) { if (!is_null($batch_numbers_array[$i]) && !is_null($batch_quantity_balances_array[$i])) { //enforce double entry per batch if (in_array($batch_sundry_ids_array[$i], $sundries_with_initial_stock_array)) { $affected_account_id = $opening_inventory_chart_of_account->id;//override adjustment a/c to be opening_inv } else{ $affected_account_id = $stock_adjustment_chart_of_account->id; } account_for_batch_reconciliations_difference($item_type = 7, $batch_sundry_ids_array[$i], $affected_account_id, $batch_numbers_array[$i], $batch_quantity_balances_array[$i], $request->reconciliation_date, "pharmacy", $ward_id = null); $batches=$this->itemService->reconcileBatches($batches,$batch_reason_array[$i],1,$item_type = 7, $batch_sundry_ids_array[$i], $batch_numbers_array[$i], $batch_quantity_balances_array[$i], $batch_expiry_dates_array[$i], "pharmacy", $batch_unit_cost[$i]??0, $batch_db_record_ids_array[$i]??0, $ward_id=null); } } if (isset($request->reconcile_stock)) { for ($x = 0; $x < count($item_ids_array); $x++): /* check if the difference value is not null and then update the optical */ if (!is_null($difference_array[$x])) { $this->itemService->createOpticalReconciliation(1,$batches,$difference_in_cost_value_array[$x],$item_ids_array[$x],$physical_stock_array[$x],$difference_array[$x],$system_stock_array[$x],1,$affected_account_id,$reconciliation_date,$request->general_comment,$max_stock_count_identifier); //update the system stock levels with the newly counted physical stock //update only those with new physical value $eye_glass = EyeGlasses::find($item_ids_array[$x]); $eye_glass->pharmacy_stock = $physical_stock_array[$x]; if (in_array($eye_glass->id, $sundries_with_initial_stock_array)) { $existing_opening_stock = is_null($eye_glass->opening_stock) ? 0 : $eye_glass->opening_stock; $eye_glass->opening_stock = $existing_opening_stock + $physical_stock_array[$x]; $eye_glass->opening_cost_price = $cost_price_array[$x]; $eye_glass->opening_stock_date = $request->reconciliation_date; $eye_glass->pharmacy_opening_stock = $physical_stock_array[$x]; } $eye_glass->updated_by = Auth::id(); $reconcile_optical_pharmacy_stock = $eye_glass->update(); }else $reconcile_optical_pharmacy_stock = true; endfor; if ($reconcile_optical_pharmacy_stock): flash('Stock levels have been reconciled')->success(); return redirect('pharmacy_optical_stock_sheet'); endif; flash('Sorry, unable to update stock')->error(); return redirect()->back(); } } public function pharmacy_optical_stock_sheet(){ $opticals = EyeGlasses::orderBy('name', 'asc')->get(); // getting the labs stock batches $opticals= calculate_stock_value($opticals,7,'pharmacy_stock'); if (count($opticals) < 1) { flash()->error("There are no registered opticals"); return redirect('/opticals/'); } else { return view('pharmacy::pharmacy.optical_stock_sheet', compact('opticals')); } } }