mirror of
https://gitlab.com/signalytic/client-external/streamline/streamline-emr.git
synced 2026-09-11 10:41:32 +00:00
452 lines
21 KiB
PHP
Executable File
452 lines
21 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Modules\Patients\Http\Controllers;
|
|
|
|
use Barryvdh\Snappy\Facades\SnappyPdf;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Database\QueryException;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Streamline\Models\Drug;
|
|
use Streamline\Models\EyeGlasses;
|
|
use Streamline\Models\HospitalInformation;
|
|
use Streamline\Models\OrderedEyeGlasses;
|
|
use Streamline\Models\OrderedService;
|
|
use Streamline\Models\OrderedSundry;
|
|
use Streamline\Models\Patient;
|
|
use Streamline\Models\PatientEpisode;
|
|
use Streamline\Models\PointOfSaleRecord;
|
|
use Streamline\Models\ReferralHospital;
|
|
use Streamline\Models\Sundry;
|
|
use Streamline\Models\Services;
|
|
use Streamline\Models\Treatment;
|
|
|
|
class PointOfSaleController extends Controller {
|
|
|
|
public function index(Request $request){
|
|
$search_text = "";
|
|
|
|
switch ($request->search_date_by){
|
|
case 'yesterday':
|
|
$end_date = Carbon::yesterday()->endOfDay();
|
|
$start_date = Carbon::yesterday()->startOfDay();
|
|
$search_text .= "Yesterday ";
|
|
break;
|
|
case 'custom_date':
|
|
$end_date = Carbon::parse($request->start_date)->endOfDay();
|
|
$start_date = Carbon::parse($request->start_date)->startOfDay();
|
|
$search_text .= "From: " . streamline_date($start_date) . " ";
|
|
break;
|
|
case 'custom_date_range':
|
|
$end_date = Carbon::parse($request->end_date)->endOfDay();
|
|
$start_date = Carbon::parse($request->start_date)->startOfDay();
|
|
$search_text .= "From: " . streamline_date($start_date) . " to " . streamline_date($end_date) . " ";
|
|
break;
|
|
case 'today':
|
|
default:
|
|
$end_date = Carbon::today()->endOfDay();
|
|
$start_date = Carbon::today()->startOfDay();
|
|
$search_text .= "Today ";
|
|
break;
|
|
}
|
|
|
|
$records = PointOfSaleRecord::join('patients', 'point_of_sale_records.patient_id', '=', 'patients.id')
|
|
->whereBetween('point_of_sale_records.created_at', [$start_date, $end_date])
|
|
->limit(500)->get(['point_of_sale_records.*', 'patients.first_name', 'patients.last_name', 'patients.number']);
|
|
|
|
return view('patients::point_of_sale.index', compact('records', 'search_text'));
|
|
}
|
|
|
|
public function order_items(){
|
|
$drugs = Drug::get();
|
|
$sundries = Sundry::where('available', 1)->get();
|
|
$services = Services::where('available', 1)->get();
|
|
$eye_glasses = EyeGlasses::get();
|
|
$referral_hospitals = ReferralHospital::orderBy('name')->get();
|
|
|
|
return view('patients::point_of_sale.order_items', compact('drugs', 'eye_glasses', 'sundries', 'referral_hospitals', 'services'));
|
|
}
|
|
|
|
public function confirm_items(Request $request){
|
|
$pre_ordered_eye_glasses = [];
|
|
$manual_patient_prescriptions = [];
|
|
$automatic_patient_prescriptions = [];
|
|
$pre_ordered_sundries = [];
|
|
$pre_ordered_services = [];
|
|
|
|
if($request->patient_id) {
|
|
$patient_id = $request->patient_id;
|
|
$patient = Patient::find($patient_id);
|
|
|
|
// double check if for existing patient_id
|
|
if($patient){
|
|
$patient_number = Patient::where('id', $patient_id)->pluck('number')->first();
|
|
$episode_id = PatientEpisode::where('patient_id',$patient_id)->whereDate('created_at', Carbon::today()->toDateString())->pluck('id')->first();
|
|
if(!$episode_id){
|
|
$episode = new PatientEpisode;
|
|
$episode->patient_id = $patient_id;
|
|
$episode->paid_over = "pos";
|
|
$episode->created_by = Auth::user()->id;
|
|
$episode->updated_by = Auth::user()->id;
|
|
$episode->save();
|
|
flash('A new episode for patient with patient number ' . $patient_number . ' has been initiated.');
|
|
|
|
$episode_id = $episode->id;
|
|
}
|
|
|
|
} else {
|
|
flash('Patient not found')->error();
|
|
redirect('point_of_sale');
|
|
}
|
|
} else {
|
|
$patient = new Patient;
|
|
$patient->first_name = $request->first_name;
|
|
$patient->last_name = $request->last_name;
|
|
$patient->phone = $request->phone_number ?? "";
|
|
$patient->referred_from = $request->referral_hospital ?? 1;
|
|
$patient->category_id = 1;
|
|
$patient->created_by = Auth::user()->id;
|
|
$patient->gender = $request->gender ?? 2;
|
|
|
|
if (is_null($request->date_of_birth)) {
|
|
$age_in_years = $request->age_in_years ?? 18;
|
|
$calculated_dob = \Carbon\Carbon::now()->subYears($age_in_years);
|
|
$calculated_date_of_birth = $calculated_dob->toDateString();
|
|
$patient->date_of_birth = $calculated_date_of_birth;
|
|
} else {
|
|
$patient->date_of_birth = Carbon::createFromFormat('d/m/Y', $request->date_of_birth)->toDateString();
|
|
}
|
|
|
|
if ($patient->save()):
|
|
$prefix = DB::table('hospital_information')->where('id', 1)->value('patient_number_abbr');
|
|
$patient_id = $patient->id;
|
|
$new_id = quadLimit($patient_id);
|
|
$patient_number = $prefix . "-" . $new_id;
|
|
DB::table('patients')->where('id', $new_id)->update(['number' => $patient_number]); // Updating the patient number
|
|
else:
|
|
flash("There was an error")->error();
|
|
return back()->withInput();
|
|
endif;
|
|
|
|
$episode = new PatientEpisode;
|
|
$episode->patient_id = $patient_id;
|
|
$episode->clinic_id = get_default_hospital_clinic();
|
|
$episode->paid_over = "pos";
|
|
$episode->created_by = Auth::user()->id;
|
|
$episode->updated_by = Auth::user()->id;
|
|
|
|
try {
|
|
$episode->save();
|
|
$episode_id = $episode->id;
|
|
flash('Patient with patient number ' . $patient_number . ' has been successfully registered.')->success();
|
|
} catch (QueryException $e) {
|
|
flash("This episode already exists!")->error();
|
|
return back()->withInput();
|
|
}
|
|
}
|
|
|
|
if ($request->selected_eye_glasses) {
|
|
$pre_ordered_eye_glasses = EyeGlasses::whereIn('id', $request->selected_eye_glasses)->get();
|
|
}
|
|
if ($request->selected_drugs) {
|
|
if($request->manual_drug_select == 1){
|
|
$manual_patient_prescriptions = Drug::whereIn('id', $request->selected_drugs)->get();
|
|
}else if($request->automatic_drug_select == 1){
|
|
$automatic_patient_prescriptions = Drug::whereIn('id', $request->selected_drugs)->get();
|
|
}
|
|
}
|
|
if ($request->selected_sundries) {
|
|
$pre_ordered_sundries = Sundry::whereIn('id', $request->selected_sundries)->get();
|
|
}
|
|
|
|
if ($request->selected_services) {
|
|
$pre_ordered_services = Services::whereIn('id', $request->selected_services)->get();
|
|
}
|
|
|
|
$allergies = DB::table('allergies')->where(['patient_id' => $patient_id])->pluck('patient_id', 'names');
|
|
|
|
return view('patients::point_of_sale.confirm_items', compact('patient_id', 'episode_id', 'pre_ordered_eye_glasses',
|
|
'manual_patient_prescriptions', 'automatic_patient_prescriptions', 'allergies', 'patient', 'pre_ordered_sundries', 'pre_ordered_services'));
|
|
}
|
|
|
|
public function confirm_pricing(Request $request){
|
|
if($request->treatment_item){
|
|
$treatment = new Treatment;
|
|
$treatment->patient_id = $request->patient_id;
|
|
$treatment->episode_id = $request->episode_id;
|
|
$treatment->drugs = implode(',', $request->treatment_item);
|
|
|
|
$drugs_array = $request->treatment_item;
|
|
$duration_array = $request->duration;
|
|
$time_array = $request->time;
|
|
$time_duration = [];
|
|
$doses = $request->dose ?? [];
|
|
$frequencies = $request->frequency ?? [];
|
|
$dose_array = [];
|
|
$frequencies_array = [];
|
|
$instructions_array = [];
|
|
|
|
for ($i = 0; $i < count($drugs_array); $i++) {
|
|
if (is_drug_chronic($drugs_array[$i])) {
|
|
register_chronic_patient($request->patient_id, $request->episode_id, $drugs_array[$i]);
|
|
}
|
|
|
|
if (isset($duration_array[$i]) && isset($time_array[$i])) {
|
|
$time_duration[] = $duration_array[$i] . " " . $time_array[$i];
|
|
} else {
|
|
$time_duration[] = "1 Days";
|
|
}
|
|
|
|
if (isset($doses[$i])) {
|
|
$dose_array[] = $doses[$i];
|
|
} else {
|
|
$dose_array[] = "1";
|
|
}
|
|
|
|
if (isset($frequencies[$i])) {
|
|
$frequencies_array[] = $frequencies[$i];
|
|
} else {
|
|
$frequencies_array[] = "2";
|
|
}
|
|
|
|
$instructions_array[] = "";
|
|
}
|
|
|
|
$treatment->doses = implode(',', $dose_array);
|
|
$treatment->frequencies = implode(',', $frequencies_array);
|
|
$treatment->instruction = implode(',', $instructions_array);
|
|
$treatment->durations = implode(',', $time_duration);
|
|
$treatment->quantities_dispensed = implode(',', $request->treatment_quantity);
|
|
$treatment->dispense_status = 0;
|
|
$treatment->created_by = Auth::id();
|
|
$treatment->save();
|
|
|
|
$request->treatment_id = DB::table('treatments')->where('episode_id', $request->episode_id)->where('patient_id', $request->patient_id)->latest()->pluck('id')->first();
|
|
}
|
|
|
|
$eye_glass_ids = $request->eye_glass_item;
|
|
$eye_glass_quantity = $request->eye_glass_quantity;
|
|
|
|
if($request->eye_glass_item){
|
|
for ($i=0; $i < count($eye_glass_ids) ; $i++) {
|
|
$new_ordered_eye_glasses = new OrderedEyeGlasses;
|
|
$new_ordered_eye_glasses->patient_id = $request->patient_id;
|
|
$new_ordered_eye_glasses->episode_id = $request->episode_id;
|
|
$new_ordered_eye_glasses->eye_glasses_id = $eye_glass_ids[$i];
|
|
$new_ordered_eye_glasses->quantity = $eye_glass_quantity[$i];
|
|
$new_ordered_eye_glasses->payment_status = 0; //0 by default to mean not paid
|
|
$new_ordered_eye_glasses->created_by = auth()->user()->id;
|
|
$new_ordered_eye_glasses->save();
|
|
}
|
|
}
|
|
|
|
if($request->pos_sundry_ids){
|
|
$new_ordered_sundries = new OrderedSundry;
|
|
$new_ordered_sundries->patient_id = $request->patient_id;
|
|
$new_ordered_sundries->episode_id = $request->episode_id;
|
|
$new_ordered_sundries->sundries_id = implode(",", $request->pos_sundry_ids);
|
|
$new_ordered_sundries->quantity = implode(",", $request->sundry_quantity);
|
|
$new_ordered_sundries->created_by = auth()->user()->id;
|
|
$new_ordered_sundries->save();
|
|
}
|
|
|
|
if ($request->service_id && $request->service_id[0] != null) {
|
|
$new_ordered_service = new OrderedService;
|
|
$new_ordered_service->patient_id = $request->patient_id;
|
|
$new_ordered_service->episode_id = $request->episode_id;
|
|
$new_ordered_service->service_id = implode(",", $request->service_id);
|
|
$new_ordered_service->quantity = implode(",", $request->quantity);
|
|
$new_ordered_service->performed = 0;
|
|
$new_ordered_service->performed_id = 0;
|
|
$new_ordered_service->created_by = auth()->user()->id;
|
|
$new_ordered_service->save();
|
|
}
|
|
|
|
$request->ordered_sundry_ids = OrderedSundry::where('episode_id', $request->episode_id)->where('patient_id', $request->patient_id)
|
|
->whereDate('created_at', Carbon::today()->toDateString())->pluck('id')->toArray();
|
|
|
|
$treatment_item = $treatment_quantity = $treatment_subtotal = [];
|
|
// save for treatment
|
|
if($request->treatment_id){
|
|
$treatment_item = $request->treatment_item;
|
|
$treatment_quantity = $request->treatment_quantity;
|
|
$treatment_subtotal = $request->treatment_subtotal;
|
|
}
|
|
|
|
$eye_glasses_prices_array = $eye_glasses_quantity_array = $eye_glasses_ids_array = [];
|
|
// save for eye_glasses arrays
|
|
if($request->eye_glass_item){
|
|
$eye_glasses_prices_array = $request->eye_glass_amount;
|
|
$eye_glasses_quantity_array = $request->eye_glass_quantity;
|
|
$eye_glasses_ids_array = $request->eye_glass_item;
|
|
}
|
|
|
|
$sundry_item = $sundry_quantity = $sundry_subtotal = [];
|
|
// save for sundries array
|
|
if($request->pos_sundry_ids){
|
|
$sundry_item = $request->pos_sundry_ids;
|
|
$sundry_quantity = $request->sundry_quantity;
|
|
$sundry_subtotal = $request->sundry_subtotal;
|
|
}
|
|
|
|
// save for service arrays
|
|
$service_ids_array = [];
|
|
$service_prices_array = [];
|
|
$service_quantity_array = [];
|
|
|
|
if($request->service_id){
|
|
$service_prices_array = $request->service_item_subtotal;
|
|
$service_ids_array = $request->service_id;
|
|
$service_quantity_array = $request->quantity;
|
|
}
|
|
|
|
$pos_record = new PointOfSaleRecord();
|
|
$pos_record->patient_id = $request->patient_id;
|
|
$pos_record->episode_id = $request->episode_id;
|
|
$pos_record->treatments = count($treatment_item) > 0 ? json_encode([
|
|
"ids" => $treatment_item, "quantity" => $treatment_quantity,
|
|
"subtotal" => $treatment_subtotal
|
|
]) : NULL;
|
|
$pos_record->eye_glasses = count($eye_glasses_ids_array) > 0 ? json_encode([
|
|
"ids" => $eye_glasses_ids_array, "quantity" => $eye_glasses_quantity_array,
|
|
"subtotal" => $eye_glasses_prices_array
|
|
]) : NULL;
|
|
$pos_record->sundries = count($sundry_item) > 0 ? json_encode([
|
|
"ids" => $sundry_item, "quantity" => $sundry_quantity,
|
|
"subtotal" => $sundry_subtotal
|
|
]) : NULL;
|
|
$pos_record->services = count($service_ids_array) > 0 ? json_encode([
|
|
"ids" => $service_ids_array, "quantity" => $service_quantity_array,
|
|
"subtotal" => $service_prices_array
|
|
]) : NULL;
|
|
$pos_record->created_by = Auth::id();
|
|
$pos_record->save();
|
|
|
|
return redirect('point_of_sale/print/' . $pos_record->id);
|
|
}
|
|
|
|
public function add_referral(Request $request) {
|
|
|
|
$logged_in_user_id = Auth::user()->id;
|
|
$referral_hospital = new ReferralHospital;
|
|
$referral_hospital->name = $request->name;
|
|
$referral_hospital->created_by = $logged_in_user_id;
|
|
$referral_hospital->updated_by = $logged_in_user_id;
|
|
|
|
if ($referral_hospital->save()) {
|
|
//insert successful
|
|
return $referral_hospital->id;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
public function get_patient(Request $request){
|
|
$patient = Patient::where('id', $request->patient_id)->first();
|
|
return $patient;
|
|
}
|
|
|
|
public function print($id) {
|
|
$record = PointOfSaleRecord::find($id);
|
|
|
|
if ($record) {
|
|
if (is_cashier_receipt_type_print_html()) {
|
|
$hospital_information = HospitalInformation::first();
|
|
$patient = Patient::find($record->patient_id);
|
|
$receipt_date = $record->created_at;
|
|
$receipt_reprint_date = date('Y-m-d h:i:s');
|
|
|
|
$treatments_array = json_decode($record->treatments, true);
|
|
$sundries_array = json_decode($record->sundries, true);
|
|
$eye_glasses_array = json_decode($record->eye_glasses, true);
|
|
$services_array = json_decode($record->services, true);
|
|
|
|
$treatment_item = $treatments_array ? $treatments_array["ids"] : [];
|
|
$treatment_quantity = $treatments_array ? $treatments_array["quantity"] : [];
|
|
$treatment_subtotal = $treatments_array ? $treatments_array["subtotal"] : [];
|
|
$eye_glasses_ids_array = $eye_glasses_array ? $eye_glasses_array["ids"] : [];
|
|
$eye_glasses_quantity_array = $eye_glasses_array ? $eye_glasses_array["quantity"] : [];
|
|
$eye_glasses_prices_array = $eye_glasses_array ? $eye_glasses_array["subtotal"] : [];
|
|
$sundry_item = $sundries_array ? $sundries_array["ids"] : [];
|
|
$sundry_quantity = $sundries_array ? $sundries_array["quantity"] : [];
|
|
$sundry_subtotal = $sundries_array ? $sundries_array["subtotal"] : [];
|
|
$service_ids_array = $services_array ? $services_array["ids"] : [];
|
|
$service_quantity_array = $services_array ? $services_array["quantity"] : [];
|
|
$service_prices_array = $services_array ? $services_array["subtotal"] : [];
|
|
|
|
return view('patients::point_of_sale.receipt', compact('treatment_item', 'treatment_quantity', 'treatment_subtotal',
|
|
'eye_glasses_prices_array', 'eye_glasses_quantity_array', 'eye_glasses_ids_array', 'hospital_information', 'patient', 'receipt_date',
|
|
'sundry_item','sundry_quantity','sundry_subtotal', 'service_ids_array', 'service_prices_array', 'service_quantity_array', 'receipt_reprint_date'));
|
|
} else {
|
|
// set up the redirect link for html
|
|
session()->put('print_pos_pdf', 1);
|
|
session()->put('print_pos_pdf_id', $id);
|
|
|
|
return redirect('/point_of_sale');
|
|
}
|
|
} else {
|
|
return redirect('/point_of_sale');
|
|
}
|
|
}
|
|
|
|
public function print_pos_pdf() {
|
|
$id = session()->get("print_pos_pdf_id");
|
|
|
|
// add check for when the people try to reload the page
|
|
if (!$id) {
|
|
return redirect('/point_of_sale');
|
|
}
|
|
|
|
// lest i forget Thy love for me
|
|
session()->forget('print_pos_pdf');
|
|
session()->forget('print_pos_pdf_id');
|
|
|
|
$record = PointOfSaleRecord::find($id);
|
|
|
|
if ($record) {
|
|
$hospital_information = HospitalInformation::first();
|
|
$patient = Patient::find($record->patient_id);
|
|
$receipt_date = $record->created_at;
|
|
$receipt_reprint_date = date('Y-m-d h:i:s');
|
|
|
|
$treatments_array = json_decode($record->treatments, true);
|
|
$sundries_array = json_decode($record->sundries, true);
|
|
$eye_glasses_array = json_decode($record->eye_glasses, true);
|
|
$services_array = json_decode($record->services, true);
|
|
|
|
$treatment_item = $treatments_array ? $treatments_array["ids"] : [];
|
|
$treatment_quantity = $treatments_array ? $treatments_array["quantity"] : [];
|
|
$treatment_subtotal = $treatments_array ? $treatments_array["subtotal"] : [];
|
|
$eye_glasses_ids_array = $eye_glasses_array ? $eye_glasses_array["ids"] : [];
|
|
$eye_glasses_quantity_array = $eye_glasses_array ? $eye_glasses_array["quantity"] : [];
|
|
$eye_glasses_prices_array = $eye_glasses_array ? $eye_glasses_array["subtotal"] : [];
|
|
$sundry_item = $sundries_array ? $sundries_array["ids"] : [];
|
|
$sundry_quantity = $sundries_array ? $sundries_array["quantity"] : [];
|
|
$sundry_subtotal = $sundries_array ? $sundries_array["subtotal"] : [];
|
|
$service_ids_array = $services_array ? $services_array["ids"] : [];
|
|
$service_quantity_array = $services_array ? $services_array["quantity"] : [];
|
|
$service_prices_array = $services_array ? $services_array["subtotal"] : [];
|
|
|
|
$data = [
|
|
"patient" => $patient, "receipt_date" => $receipt_date, "receipt_reprint_date" => $receipt_reprint_date, "hospital_information" => $hospital_information,
|
|
"treatment_item" => $treatment_item, "treatment_quantity" => $treatment_quantity, "treatment_subtotal" => $treatment_subtotal,
|
|
"eye_glasses_ids_array" => $eye_glasses_ids_array, "eye_glasses_quantity_array" => $eye_glasses_quantity_array, "eye_glasses_prices_array" => $eye_glasses_prices_array,
|
|
"sundry_item" => $sundry_item, "sundry_quantity" => $sundry_quantity, "sundry_subtotal" => $sundry_subtotal,
|
|
"service_ids_array" => $service_ids_array, "service_quantity_array" => $service_quantity_array, "service_prices_array" => $service_prices_array,
|
|
];
|
|
|
|
$pdf = SnappyPDF::loadView('patients::point_of_sale.print_pos_pdf', $data)
|
|
->setOrientation('portrait')
|
|
->setPaper('a4')
|
|
->setOption('margin-bottom', 5)
|
|
->setOption('margin-top', 5)
|
|
->setOption('footer-html', '<i>© ' . date('Y') . ' Stre@mline</i>');
|
|
|
|
return $pdf->inline('Patient Receipt' . date(" d-m-y h:ia") . '.pdf');
|
|
} else {
|
|
return redirect('/point_of_sale');
|
|
}
|
|
}
|
|
}
|