Files
streamline-emr/docker/streamline-src/Modules/WardManagement/Http/Controllers/WardItemRequestController.php
T

437 lines
22 KiB
PHP
Executable File

<?php
namespace Modules\WardManagement\Http\Controllers;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Illuminate\Http\Request;
use Carbon\Carbon;
use Illuminate\Support\Facades\Auth;
use Streamline\Models\HospitalInformation;
use Streamline\Models\User;
use Streamline\Models\WardItemRequest;
use Illuminate\Support\Facades\DB;
use Streamline\Models\Sundry;
use Streamline\Models\Drug;
use Streamline\Models\GeneralItem;
use Streamline\Services\UserService;
class WardItemRequestController extends Controller {
protected UserService $userService;
public function __construct(
UserService $userService
) {
$this->userService = $userService;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* 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)
{
//
}
/* incoming ward drug requests */
public function incoming_ward_requests(Request $request) {
$search_complete = null;
$ward_item_requests = null;
$start_date = null; $end_date = null;
if (!is_null($request->item_type)) {
$search_complete = 1;
$start_date = Carbon::parse($request->start_date)->startOfDay()->toDateTimeString();
$end_date = Carbon::parse($request->end_date)->endOfDay()->toDateTimeString();
if ($request->ward_id) {
$ward_item_requests = WardItemRequest::where('item_type', $request->item_type)->where('ward_id',$request->ward_id)->whereBetween('created_at', [$start_date, $end_date])->orderBy('created_at','desc')
->get();
} else {
$ward_item_requests = WardItemRequest::where('item_type', $request->item_type)
->whereBetween('created_at', [$start_date, $end_date])->orderBy('created_at','desc')
->get();
}
} else {
//show drug requests of last 24 hours
$last_24_hours = Carbon::now()->subDay()->toDateTimeString();
$ward_item_requests = WardItemRequest::where('created_at', '>=', $last_24_hours)->orderBy('created_at','desc')->get();
}
$wards = DB::table('wards')->where('available', 1)->whereNull('deleted_at')->orderBy('name')->pluck('name', 'id')->toArray();
$wards = ['' => '- select -'] + $wards;
return view('ward_management::ward_item_requests.incoming_ward_requests',compact('wards','search_complete', 'ward_item_requests', 'start_date', 'end_date','wards'));
}
/* ward request form */
public function ward_item_requests(Request $request) {
$item_type = null; $ward_id = null; $drugs_requested = null; $general_items_requested = null; $sundries_requested = null;
$drugs = DB::table('drugs')->where('available', 1)->whereNull('deleted_at')->orderBy('name')->pluck('name', 'id');
$sundries = DB::table('sundries')->whereNull('deleted_at')->orderBy('name')->pluck('name', 'id');
$general_items = DB::table('general_items')->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;
$all_ward_item_requests = WardItemRequest::whereNull('dispensation_status')->paginate(500);
if (!is_null($request->item_type)) {
$ward_id = $request->ward;
$item_type = $request->item_type;
if($item_type == "1"){
$drugs_requested = $request->drugs_requested;
} else if($item_type == "2"){
$sundries_requested = $request->sundries_requested;
} else {
$general_items_requested = $request->general_items_requested;
}
}
return view('ward_management::ward_item_requests.ward_item_request',compact('drugs','wards','sundries', 'general_items', 'item_type','ward_id',
'drugs_requested', 'sundries_requested', 'general_items_requested', 'all_ward_item_requests'));
}
/* store ward drug requests */
public function store_ward_item_requests(Request $request) {
if (in_array(null, $request->quantity_requested)) {
flash("Please fill in the required fields")->error();
return back()->withInput();
}
$ward_drug_request = new WardItemRequest;
$ward_drug_request->ward_id = $request->ward_id;
$ward_drug_request->item_type = $request->item_type;
$ward_drug_request->item_ids = implode(",", $request->item_id);
$ward_drug_request->item_quantities = implode(",", $request->quantity_requested);
$ward_drug_request->balance_on_ward_during_request = implode(",", $request->balance_on_ward_during_request);
$ward_drug_request->balance_returned = implode(",", $request->balance_returned);
$ward_drug_request->item_unit_cost = implode(",", $request->item_unit_cost);
$ward_drug_request->order_comment = $request->order_comment;
$ward_drug_request->created_by = Auth::id();
$ward_drug_request->save();
flash('Ward request has been successfully submitted')->success();
return redirect('ward_item_requests');
}
/* show details of a ward item request */
public function ward_item_request_details(Request $request)
{
$ward_request_id = $request->ward_item_request_id;
$ward_request_details = WardItemRequest::find($ward_request_id);
$staff_array = $this->userService->pluckUserFullName();
$batches_array = [];
return view('ward_management::ward_item_requests.ward_item_request_details',compact('ward_request_details','staff_array', 'batches_array'));
}
/* store a ward item request action */
public function store_ward_item_request_details_action(Request $request)
{
$ward_request_id = $request->ward_request_id;
$approved_button = $request->approve;
$dispensed_button = $request->dispense;
$ward_request_record = WardItemRequest::find($ward_request_id);
$ward_id = $ward_request_record->ward_id;
$item_ids_array = $request->item_ids;
$dispensed_batches_array = $request->dispensed_from_batch;
$ward_request_record->item_quantities_approved = implode(",", $request->quantity_approved);
$ward_request_record->item_ids_issued_out = implode(",", $request->item_ids);
$ward_request_record->quantity_issued_out = implode(",", $request->quantity_issued_out);
if (isset($approved_button)) {
$ward_request_record->comment = $request->comment;
$ward_request_record->approved_status = 1;
$ward_request_record->approved_by = Auth::id();
$ward_request_record->approval_date = Carbon::now();
$ward_request_record->update();
flash('ward request has been approved')->success();
return redirect('incoming_ward_requests');
} elseif (isset($dispensed_button)) {
$ward_request_record->received_by = $request->received_by;
$ward_request_record->dispensation_status = 1;
$ward_request_record->dispensed_by = Auth::id();
$ward_request_record->dispensation_date = Carbon::parse($request->dispensation_date)->toDateTimeString();
$received_from_stores_or_pharmacy = $request->received_from;
$balance_returned_array = $request->balance_returned;
$item_quantities_issued_out_array = $request->quantity_issued_out;
// 1 - means received from pharmacy, 2 means received from stores so do the respective stock reduction
if ($received_from_stores_or_pharmacy == 1) {
$ward_request_record->issued_from = "pharmacy";
if ($ward_request_record->item_type == 1) {
for ($i=0; $i < count($item_ids_array) ; $i++) {
$drug = Drug::find($item_ids_array[$i]);
if ($drug && !is_null($dispensed_batches_array[$i])) {
$stock_before_making_necessary_calculations = $drug->pharmacy_stock;
$balance_returned = empty($balance_returned_array[$i]) ? 0 : $balance_returned_array[$i];
$quantity_approved = empty($item_quantities_issued_out_array[$i]) ? 0 : $item_quantities_issued_out_array[$i];
$drug->pharmacy_stock = $stock_before_making_necessary_calculations + (int)$balance_returned - (int)$quantity_approved;
$drug->update();
// return the drugs to pharmacy
reduce_ward_stock_with_consumed_quantity($item_ids_array[$i], $balance_returned, 1, $ward_id, null, null, null);
update_ward_stock($ward_id, 1, $item_ids_array[$i], $item_quantities_issued_out_array[$i]);
move_batch_item_from_pharmacy_to_ward($item_type = 1, $item_ids_array[$i], $dispensed_batches_array[$i], $item_quantities_issued_out_array[$i], $ward_id);
}
}
} elseif ($ward_request_record->item_type == 2) {
for ($i=0; $i < count($item_ids_array) ; $i++) {
$sundry = Sundry::find($item_ids_array[$i]);
if ($sundry && !is_null($dispensed_batches_array[$i])) {
$stock_before_making_necessary_calculations = $sundry->pharmacy_stock;
$balance_returned = empty($balance_returned_array[$i]) ? 0 : $balance_returned_array[$i];
$quantity_approved = empty($item_quantities_issued_out_array[$i]) ? 0 : $item_quantities_issued_out_array[$i];
$sundry->pharmacy_stock = $stock_before_making_necessary_calculations + (int)$balance_returned - (int)$quantity_approved;
$sundry->update();
// return the drugs to pharmacy
reduce_ward_stock_with_consumed_quantity($item_ids_array[$i], $balance_returned, 2, $ward_id, null, null, null);
update_ward_stock($ward_id, 2, $item_ids_array[$i], $item_quantities_issued_out_array[$i]);
move_batch_item_from_pharmacy_to_ward($item_type = 2, $item_ids_array[$i], $dispensed_batches_array[$i], $item_quantities_issued_out_array[$i], $ward_id);
}
}
} elseif ($ward_request_record->item_type == 3) {
for ($i=0; $i < count($item_ids_array) ; $i++) {
$general_item = GeneralItem::find($item_ids_array[$i]);
if ($general_item && !is_null($dispensed_batches_array[$i])) {
$stock_before_making_necessary_calculations = $general_item->pharmacy_stock;
$balance_returned = empty($balance_returned_array[$i]) ? 0 : $balance_returned_array[$i];
$quantity_approved = empty($item_quantities_issued_out_array[$i]) ? 0 : $item_quantities_issued_out_array[$i];
$general_item->pharmacy_stock = $stock_before_making_necessary_calculations + (int)$balance_returned - (int)$quantity_approved;
$general_item->update();
// return the drugs to pharmacy
reduce_ward_stock_with_consumed_quantity($item_ids_array[$i], $balance_returned, 3, $ward_id, null, null, null);
update_ward_stock($ward_id, 3, $item_ids_array[$i], $item_quantities_issued_out_array[$i]);
move_batch_item_from_pharmacy_to_ward($item_type = 6, $item_ids_array[$i], $dispensed_batches_array[$i], $item_quantities_issued_out_array[$i], $ward_id);
}
}
}
} elseif ($received_from_stores_or_pharmacy == 2) {
$ward_request_record->issued_from = "store";
if ($ward_request_record->item_type == 1) {
for ($i=0; $i < count($item_ids_array) ; $i++) {
$drug = Drug::withTrashed()->find($item_ids_array[$i]);
if ($drug && !is_null($dispensed_batches_array[$i])) {
$stock_before_making_necessary_calculations = $drug->store_stock;
$balance_returned = empty($balance_returned_array[$i]) ? 0 : $balance_returned_array[$i];
$quantity_approved = empty($item_quantities_issued_out_array[$i]) ? 0 : $item_quantities_issued_out_array[$i];
$drug->store_stock = $stock_before_making_necessary_calculations + (int)$balance_returned - (int)$quantity_approved;
$drug->update();
// return the drugs to pharmacy
reduce_ward_stock_with_consumed_quantity($item_ids_array[$i], $balance_returned, 1, $ward_id, null, null, null);
update_ward_stock($ward_id, 1, $item_ids_array[$i], $item_quantities_issued_out_array[$i]);
move_batch_item_from_store_to_ward($item_type = 1, $item_ids_array[$i], $dispensed_batches_array[$i], $item_quantities_issued_out_array[$i], $ward_id, $ward_request_id);
//cater for drug batch processing
/* $batch_number = null;
if (batch_tracking_method() == "manual") {
$batch_number = $dispensed_batches_array[$i] ?? null;
}
$item_batch_calculations = batch_calculations_for_item_based_on_fifo($item_ids_array[$i], $quantity_approved, $batch_number, $item_type = 1); */
}
}
} elseif ($ward_request_record->item_type == 2) {
for ($i=0; $i < count($item_ids_array) ; $i++) {
$sundry = Sundry::withTrashed()->find($item_ids_array[$i]);
if ($sundry && !is_null($dispensed_batches_array[$i])) {
$stock_before_making_necessary_calculations = $sundry->store_stock;
$balance_returned = empty($balance_returned_array[$i]) ? 0 : $balance_returned_array[$i];
$quantity_approved = empty($item_quantities_issued_out_array[$i]) ? 0 : $item_quantities_issued_out_array[$i];
$sundry->store_stock = $stock_before_making_necessary_calculations + (int)$balance_returned - (int)$quantity_approved;
$sundry->update();
// return the drugs to pharmacy
reduce_ward_stock_with_consumed_quantity($item_ids_array[$i], $balance_returned, 2, $ward_id, null, null, null);
update_ward_stock($ward_id, 2, $item_ids_array[$i], $item_quantities_issued_out_array[$i]);
move_batch_item_from_store_to_ward($item_type = 2, $item_ids_array[$i], $dispensed_batches_array[$i], $item_quantities_issued_out_array[$i], $ward_id, $ward_request_id);
//cater for sundries batch processing
/* $batch_number = null;
if (batch_tracking_method() == "manual") {
$batch_number = $dispensed_batches_array[$i] ?? null;
}
$item_batch_calculations = batch_calculations_for_item_based_on_fifo($item_ids_array[$i], $quantity_approved, $batch_number, $item_type = 2); */
}
}
} elseif ($ward_request_record->item_type == 3) {
for ($i=0; $i < count($item_ids_array) ; $i++) {
$general_item = GeneralItem::find($item_ids_array[$i]);
if ($general_item && !is_null($dispensed_batches_array[$i])) {
$stock_before_making_necessary_calculations = $general_item->store_stock;
$balance_returned = empty($balance_returned_array[$i]) ? 0 : $balance_returned_array[$i];
$quantity_approved = empty($item_quantities_issued_out_array[$i]) ? 0 : $item_quantities_issued_out_array[$i];
$general_item->store_stock = $stock_before_making_necessary_calculations + (int)$balance_returned - (int)$quantity_approved;
$general_item->update();
// return the drugs to pharmacy
reduce_ward_stock_with_consumed_quantity($item_ids_array[$i], $balance_returned, 3, $ward_id, null, null, null);
update_ward_stock($ward_id, 3, $item_ids_array[$i], $item_quantities_issued_out_array[$i]);
move_batch_item_from_store_to_ward($item_type = 6, $item_ids_array[$i], $dispensed_batches_array[$i], $item_quantities_issued_out_array[$i], $ward_id, $ward_request_id);
}
}
}
}
$ward_request_record->update();
flash('Items for '.get_name($ward_request_record->ward_id, "id", "name", "wards").' have been successfully dispensed')->success();
return view('ward_management::ward_item_requests.print_ward_item_request_receipt',compact('ward_request_record'));
}
}
public function show_ward_item_request_details_action(Request $request)
{
$ward_request_id = $request->ward_request_id;
$ward_request_details = WardItemRequest::find($ward_request_id);
return view('ward_management::ward_item_requests.ward_request_show',compact('ward_request_details'));
}
public function ward_item_request_edit(Request $request)
{
$ward_request_id = $request->ward_request_id;
$ward_request_details = WardItemRequest::find($ward_request_id);
$search_status = false;
return view('ward_management::ward_item_requests.ward_item_request_edit',compact('ward_request_details', 'search_status'));
}
public function edit_ward_item_request_search(Request $request)
{
$ward_request_id = $request->ward_request_id;
$ward_request_details = WardItemRequest::find($ward_request_id);
$search_status = true;
$selected_item_ids_array = $request->items_ids;
return view('ward_management::ward_item_requests.ward_item_request_edit',compact('ward_request_details', 'search_status', 'selected_item_ids_array'));
}
public function update_ward_item_requests(Request $request)
{
$ward_request_id = $request->ward_request_id;
$ward_item_request = WardItemRequest::find($ward_request_id);
$ward_item_request->item_ids = implode(",", $request->item_ids);
$ward_item_request->item_quantities = implode(",", $request->item_quantities);
$ward_item_request->balance_on_ward_during_request = implode(",", $request->balance_on_ward_during_request);
$ward_item_request->balance_returned = implode(",", $request->balance_returned);
$ward_item_request->item_unit_cost = implode(",", $request->item_unit_cost);
$ward_item_request->order_comment = $request->order_comment;
$ward_item_request->created_by = Auth::id();
$ward_item_request->save();
flash('Ward request has been successfully submitted')->success();
return redirect('ward_item_requests');
}
public function ward_item_request_delete(Request $request)
{
$ward_request_id = $request->ward_request_id;
$ward_item_request = WardItemRequest::find($ward_request_id);
$ward_item_request->delete();
flash('Ward request has been successfully deleted')->error();
return redirect('ward_item_requests');
}
public function print_ward_item_request_details($id) {
$ward_request_record = WardItemRequest::find($id);
return view('ward_management::ward_item_requests.print_ward_item_request_receipt',compact('ward_request_record'));
}
public function print_ward_item_request_details_pdf($id) {
$ward_request_record = WardItemRequest::find($id);
$hospital_information = HospitalInformation::find(1);
$data = [
'ward_request_record' => $ward_request_record,
'hospitalInfo' => $hospital_information
];
$print_footer = (!is_null($hospital_information->print_footer)) ? '&nbsp&nbsp&nbsp&nbsp&nbsp<i>' . $hospital_information->print_footer . '</i>' : '';
$pdf = SnappyPDF::loadView("ward_management::ward_item_requests/print_ward_item_request_details_pdf", $data)
->setOrientation('portrait')
->setPaper('a4')
->setOption('margin-bottom', 5)
->setOption('margin-top', 5)
->setOption('footer-html', '<i>&copy; ' . date('Y') . ' Stre@mline</i>' . $print_footer);
return $pdf->inline('Ward Item Request Details' . date(" d-m-y h:ia") . '.pdf');
}
}