model = $sampleModel; $this->physicianModel = $physicianModel; $this->sampleSourceModel = $sampleSourceModel; $this->patientModel = $patientModel; $this->rejectCommentModel = $rejectCommentModel; $this->sampleDetailModel = $sampleDetailModel; $this->testResultModel = $testResultModel; $this->testGroupModel = $testGroupModel; $this->organismResultModel = $organismResultModel; $this->antibioticResultModel = $antibioticResultModel; $this->invoiceModel = $invoiceModel; $this->invoiceDetailModel = $invoiceDetailModel; $this->laboratoryConfigures = $laboratoryConfigures; $this->baseOrganizationId = Session::get('base_organization_id'); $this->base = Session::get('base_organization'); } public function index(Request $request){ if(!GlobalController::user_can(Auth::user()->role_id, ['view_sample'])) return redirect(url('my-profile')); $recordStatusConditions = Auth::id()==1 ? [RecordStatusEnum::ACTIVE, RecordStatusEnum::DELETE] : [RecordStatusEnum::ACTIVE]; $samples = $this->model::with(['patient','sample_source']) ->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusConditions) ->where('organization_id', $this->baseOrganizationId) ->when(Auth::user()->role_id == UtilEnum::PHYSICIAN_ROLE, function($sample){ $sample->where('sample_source_id', Auth::user()->sample_source_id); })->when(!empty(trim($request->kword)), function ($samples) use($request, $recordStatusConditions){ $samples->whereRaw("replace(sample_number, ' ','') like '%".str_replace(" ","",$request->kword)."%'") ->orWhereIn('patient_id', $this->patientModel::query() ->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'") ->orWhereRaw("replace(phone_number, ' ','') like '%".str_replace(" ","",$request->kword)."%'") ->orWhere('patient_uuid','like','%'.$request->kword.'%')->pluck('id')->toArray() )->where('organization_id', $this->baseOrganizationId)->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusConditions); })->when(!empty(trim($request->sample_status)), function ($samples) use($request){ $samples->whereIn('id', $this->filterSampleStatus($request->sample_status)); })->when(!empty($request->sample_date) && empty($request->kword) , function ($samples) use($request){ $samples->whereDate('admission_date', date('Y-m-d',strtotime($request->sample_date))); })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('nrml.pagination.perpage', 10)); return view('sample', ['samples' => $samples]); } function filterSampleStatus($statusId){ if($statusId == 5){ // rejected $wheres = " and sample.`sample_condition` = 0 "; }elseif ($statusId == 4){ // printed $wheres = " and (sample.`sample_condition` <>0 and sample.`is_printed` = 1) "; }elseif ($statusId == 1){ // pending, not request test, no result input $wheres = " and (sample.`sample_condition` <>0 and sample.`is_printed` = 0 and (non_heading_tests=0 or (done_numeric_tests+done_org_test)=0)) "; }elseif ($statusId == 3){ $wheres = " and (sample.`sample_condition` <>0 and sample.`is_printed` = 0 and non_heading_tests>0 and non_heading_tests = (done_numeric_tests+done_org_test))"; }elseif ($statusId ==2 ){ $wheres = " and (sample.`sample_condition` <>0 and sample.`is_printed` = 0 and (done_numeric_tests+done_org_test)>0 and non_heading_tests > (done_numeric_tests+done_org_test))"; } else{ $wheres = ""; } $resultItemsData = DB::select('SELECT * FROM ( SELECT s.id, s.`sample_number`, IFNULL(sample_condition,1) AS sample_condition, is_printed, SUM(IF(ts.`field_type`>0, 1,0)) AS non_heading_tests, SUM(IF(ts.`field_type` IN(1,4) AND tr.test_result IS NOT NULL, 1, 0)) AS done_numeric_tests, SUM(IF(ts.`field_type` IN(2,3) AND org_result.total_org_result>0, 1, 0)) AS done_org_test FROM samples s LEFT JOIN test_results tr ON tr.`sample_id` = s.`id` AND s.`organization_id` = tr.`organization_id` LEFT JOIN test_samples ts ON ts.id = tr.`test_sample_id` AND ts.organization_id = tr.organization_id LEFT JOIN sample_types st ON st.id = ts.`sample_type_id` LEFT JOIN( SELECT tr.`id`, COUNT(*) AS total_org_result FROM samples s INNER JOIN test_results tr ON tr.`sample_id` = s.`id` AND s.`organization_id` = tr.`organization_id` INNER JOIN organism_results orgr ON orgr.`test_result_id` = tr.`id` WHERE s.organization_id = '.$this->baseOrganizationId.' AND tr.`record_status_id` = 1 AND orgr.`record_status_id` = 1 GROUP BY tr.id ) AS org_result ON org_result.id = tr.`id` WHERE s.`organization_id` = '.$this->baseOrganizationId.' AND s.`record_status_id` = 1 AND (tr.`record_status_id` = 1 OR tr.`record_status_id` IS NULL) AND (st.`record_status_id` = 1 OR st.`record_status_id` IS NULL) GROUP BY s.id, s.`sample_number`, s.sample_condition, s.is_printed ) sample WHERE 1 '.$wheres.' '); $arr = []; foreach ($resultItemsData as $row){ $arr[] = $row->id; } return $arr; } public function create($patient_id = null){ if(!GlobalController::user_can(Auth::user()->role_id, ['create_sample'])) return redirect(url('my-profile')); $rejectComments = $this->rejectCommentModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('reject_comment', 'ASC')->get(); $physicians = $this->physicianModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId])->orderBy('name_en', 'ASC')->get(); $sampleSources = $this->sampleSourceModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId])->orderBy('name_en','ASC')->get(); $patients = $this->patientModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId]) ->when(!empty($patient_id), function ($patients) use ($patient_id){ $patients->where(['id' => $patient_id, 'organization_id' => $this->baseOrganizationId ]); })->orderBy(BaseModel::CREATED_AT_FIELD, 'DESC')->limit(30)->get(); $testGroups = $this->testGroupModel::with(['testGroupDetails'])->where(['organization_id' => $this->baseOrganizationId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('created_at')->get(); return view('new_sample', [ 'labSettings' => (object) $this->base, 'physicians' => $physicians, 'sampleSources' => $sampleSources, 'patients' => $patients, 'rejectComments' => $rejectComments, 'provinces' => $this->province(), 'patient_id' => $patient_id, 'testGroups' => $testGroups ]); } public function generateAutoId($admissionDate){ $prefix = date('ymd',strtotime($admissionDate)); $sample = Sample::query(); $sampleCount = $sample->where('organization_id', $this->baseOrganizationId)->whereRaw('date(admission_date) ="'. date('Y-m-d',strtotime($admissionDate)).'"')->count(); return 'S-'.$this->base['short_name'].'-'.$prefix.'-'.(str_pad(($sampleCount+1),3,'0',STR_PAD_LEFT)); } public function store(SampleCreateRequest $sampleCreateRequest){ DB::beginTransaction(); try{ if(!GlobalController::user_can(Auth::user()->role_id, ['create_sample'])) return false; $request = collect($sampleCreateRequest)->merge(['organization_id'=>$this->baseOrganizationId]); if(empty($sampleCreateRequest->sample_number)) { $sampleNumber = $this->generateAutoId($sampleCreateRequest->admission_date); $request = $request->merge(['sample_number' => $sampleNumber]); } $sample = $this->model::query()->where(['sample_number' => $request['sample_number']])->get()->first(); if(!empty($sample)){ if($sample->patient_id !=$request['patient_id']){ if(empty($sampleCreateRequest->sample_number)) { sleep(50); $sampleNumber = $this->generateAutoId($sampleCreateRequest->admission_date); $request = $request->merge(['sample_number' => $sampleNumber]); } else{ return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => ['Duplicate Sample Number']]); } $patientSample = $this->model::query()->create($request->all()); $patientSample = $this->model::with(['patient','sample_source'])->find($patientSample->id); } else{ $patientSample = $this->model::with(['patient','sample_source'])->find($sample->id); } } else{ $patientSample = $this->model::query()->create($request->all()); $patientSample = $this->model::with(['patient','sample_source','physician'])->find($patientSample->id); } DB::commit(); return response()->json(['success' => true, 'message' => __('sample.create_success'), 'data' => new SampleResource($patientSample)]); } catch (\Exception $e){ DB::rollBack(); return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => [$e->getMessage()]]); } } public function store1(SampleCreateRequest $sampleCreateRequest){ DB::beginTransaction(); try{ $request = collect($sampleCreateRequest)->merge(['organization_id'=>$this->baseOrganizationId]); if(empty($sampleCreateRequest->sample_number)) { $sampleNumber = $this->generateAutoId($sampleCreateRequest->admission_date); $request = $request->merge(['sample_number' => $sampleNumber]); } $patientSample = $this->model::query()->create($request->all()); $patientSample = $this->model::with(['patient','sample_source'])->find($patientSample->id); DB::commit(); return response()->json(['success' => true, 'message' => __('sample.create_success'), 'data' => new SampleResource($patientSample)]); } catch (\Exception $e){ DB::rollBack(); return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => [$e->getMessage()]]); } } public function edit(Request $request, $id){ // url: base_url/sample/edit/[sample-id] if(!GlobalController::user_can(Auth::user()->role_id, ['update_sample'])) return redirect(url('my-profile')); $sample = $this->model::with(['patient'/*'patient.telegramChatId'*/,'invoice'])->where(['organization_id' => $this->baseOrganizationId,'id' => $id])->first(); $rejectComments = $this->rejectCommentModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('reject_comment', 'ASC')->get(); $physicians = $this->physicianModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId])->orderBy('name_en', 'ASC')->get(); $samplePhysician = $this->physicianModel::query()->where('id', $sample->physician_id)->first(); $sampleSources = $this->sampleSourceModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId])->orderBy('name_en','ASC')->get(); $testGroups = $this->testGroupModel::with(['testGroupDetails'])->where(['organization_id' => $this->baseOrganizationId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('created_at')->get(); $now = strtotime($sample->admission_date); // or your date as well $your_date = strtotime($sample->patient->dob); $datediff = $now - $your_date; $form = $sample->sample_tests->pluck('testSample')->pluck('sample')->unique()->first(); $enter_form_id = $form->enter_form_id ?? ($this->base['lab_category_id']==0? 1:2); $preview_form_id = $form->preview_form_id ?? ($this->base['lab_category_id']==0? 1:2); $prevSample = []; if(isset($_GET['previous_sample'])){ $prevSample = $this->model::with(['patient','invoice'])->where(['organization_id' => $this->baseOrganizationId, 'id' => $_GET['previous_sample']])->get(); } $labConfigures = $this->laboratoryConfigures::query()->where(['organization_id' => $this->baseOrganizationId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get()->toArray(); $resultTemplateId = (collect($labConfigures)->where('atrribute_code', 'RESULT_TEMPLATE')->pluck('assigned_attribute_value')->first()); if(!empty($resultTemplateId)){ $preview_form_id = $resultTemplateId; } if($sample->result_template_id > 0){ $preview_form_id = $sample->result_template_id; } return view('sample_edition', [ 'sample' => $sample, 'labSettings' => (object) $this->base, 'physicians' => $physicians, 'sampleSources' => $sampleSources, 'rejectComments' => $rejectComments, 'testGroups' => $testGroups, 'samplePhysician' => $samplePhysician, 'agedy' => number_format((round($datediff / (60 * 60 * 24))/360),2), 'enter_form_id' => $enter_form_id, // $form->enter_form_id ?? 1, 'preview_form_id' => $preview_form_id . (isset($request->previous_sample) ? '_previous_sample':''), 'previous_samples' => $this->getPreviousSample($sample->patient_id, $id), 'labConfigures' => $labConfigures, 'prevSample' => $prevSample, 'firstPrvSampleId' => (int)@$this->getPreviousSample($sample->patient_id, $id)->first()->id, 'firstPrvSampleDate' => (string) !empty($this->getPreviousSample($sample->patient_id, $id)->first()) ? date('d-m-Y', strtotime($this->getPreviousSample($sample->patient_id, $id)->first()->admission_date)) : '', 'selected_pre_sample_date' => isset($request->previous_sample) ? date('d-m-Y', strtotime($this->getPreviousSample($sample->patient_id, $id)->where('id', $request->previous_sample)->first()->admission_date)) : '' ]); } function getPreviousSample($patientId, $curSampleId){ return $this->model::query()->where(['patient_id' => $patientId, 'organization_id' => $this->baseOrganizationId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) ->where('id','<', $curSampleId)->orderBy('id', 'desc')->get(['id','admission_date', 'sample_number']); } /** Update Sample Only * @param SampleUpdateRequest $sampleUpdateRequest * @return \Illuminate\Http\RedirectResponse */ public function update(SampleUpdateRequest $sampleUpdateRequest){ DB::beginTransaction(); try{ if(!GlobalController::user_can(Auth::user()->role_id, ['update_sample'])) return redirect(url('my-profile')); $request = collect($sampleUpdateRequest)->except(['id','sample_number','patient_id','_token']); $patientSample = $this->model::query()->where(['id' => $sampleUpdateRequest->id, 'organization_id' => $this->baseOrganizationId])->first(); $patientSample->update($request->all()); DB::commit(); $sampleUpdateRequest->session()->flash('message','Update success.'); return redirect()->back(); } catch (\Exception $e){ if(Auth::id()==1){ dd($e); } DB::rollBack(); $sampleUpdateRequest->session()->flash('message','Update failed.'); return redirect()->back(); } } /** Perform by ajax function */ public function delete(Request $request){ try{ if(!GlobalController::user_can(Auth::user()->role_id, ['delete_sample'])) return false; $patientSample = $this->model::query()->where(['id' => $request->uid, 'organization_id' => $this->baseOrganizationId])->first(); $patientSample->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); return response()->json(['success' => true, 'message' => __('sample.delete_success')]); } catch (\Exception $e){ return response()->json(['success' => false, 'message' => __('sample.delete_fail'), 'errors' => $e->getMessage()]); } } public function restore(Request $request){ try{ $patientSample = $this->model::query()->where(['id' => $request->uid, 'organization_id' => $this->baseOrganizationId])->first(); $patientSample->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); return response()->json(['success' => true, 'message' => __('sample.restore_success')]); } catch (\Exception $e){ return response()->json(['success' => false, 'message' => __('sample.restore_fail'), 'errors' => $e->getMessage()]); } } public function approve(Request $request){ try{ if(!GlobalController::user_can(Auth::user()->role_id, ['approve_result'])) return false; $patientSample = $this->model::query()->where(['id' => $request->uid, 'organization_id' => $this->baseOrganizationId])->first(); $patientSample->update(array('approved_by' => Auth::id(), 'approved_date' => date('Y-m-d H:i:s'))); return response()->json(['success' => true, 'message' => __('sample.approve_success')]); } catch (\Exception $e){ return response()->json(['success' => false, 'message' => __('sample.approve_fail'), 'errors' => $e->getMessage()]); } } /** Sample Detail / Assign Test */ public function storeSampleDetail(SampleDetailCreateRequest $sampleCreateRequest){ set_time_limit(6000); ini_set('memory_limit', '10240M'); DB::beginTransaction(); try{ if(!GlobalController::user_can(Auth::user()->role_id, ['create_sample', 'update_sample'])) return false; $this->sampleDetailModel::query()->where(['sample_id' => $sampleCreateRequest->sample_id, 'organization_id' => $this->baseOrganizationId])->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); $sampleDetails = collect($sampleCreateRequest->sample_details); $sampleDetails->map(function ($item){ if(!empty($item['sample_description'])){ $sampleDetail = $this->sampleDetailModel::query()->create([ 'sample_id' => $item['sample_id'], 'sample_type_id' => $item['sample_type_id'], 'test_date' => date('Y-m-d'), 'lab_technician_id' => Auth::id(), 'sample_descr' => $item['sample_description'], 'organization_id' => $this->baseOrganizationId ]); } }); //dd($sampleCreateRequest->sample_tests); if(!empty($sampleCreateRequest->sample_tests)){ $this->testResultModel::query()->where(['sample_id' => $sampleCreateRequest->sample_id, 'organization_id' => $this->baseOrganizationId]) ->whereNotIn('test_sample_id', $sampleCreateRequest->sample_tests) ->delete(); foreach ($sampleCreateRequest->sample_tests as $test){ $existingTestResult = $this->testResultModel::query()->where([ 'test_sample_id' => $test, 'organization_id' => $this->baseOrganizationId, 'sample_id' => $sampleCreateRequest->sample_id ])->get()->toArray(); if(empty($existingTestResult)) { $testResult = $this->testResultModel::query()->create([ 'sample_id' => $sampleCreateRequest->sample_id, 'test_sample_id' => $test, 'organization_id' => $this->baseOrganizationId ]); } } }else{ $this->testResultModel::query()->where(['sample_id' => $sampleCreateRequest->sample_id, 'organization_id' => $this->baseOrganizationId])->delete(); } /** * Create or Update Invoice in case invoice generation mode is auto start */ $labSettings = (object) $this->base; if($labSettings->is_auto_make_invoice == 1) { $sample = $this->model::with('invoice')->find($sampleCreateRequest->sample_id); $invoiceDetail = $this->makeInvoice($sample->id); $request = new Request($invoiceDetail); $summary = collect($request); $total = $summary->sum('usd_price'); $grossTotal = $summary->sum('item_discount'); // total price after discount $discount = $total - $grossTotal; $invoiceId = 0; $discounts = $summary->sum('discount_price'); if (empty($sample->invoice)) { // create new $invoiceRequest = collect($request)->merge([ 'invoice_code' => $this->generateInvoiceId(date('Y-m-d', strtotime($sample->admission_date))),// 'I-'.Helpers::generateUuId($labSettings->short_name), 'sample_id' => $sample->id, 'total' => $total * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1), 'discount' => $discounts * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1), 'discount_type' => $labSettings->discount_type, 'gross_total' => number_format($grossTotal * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1),2, '.', ''), 'deposit' => 0, 'bank_deposit' => 0, 'balance' => number_format($grossTotal * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1),2, '.', ''), 'invoice_date' => date('Y-m-d', strtotime($sample->admission_date)), 'organization_id'=>$this->baseOrganizationId, 'exchange_rate' => $labSettings->exchange_rate ]); $invoice = $this->invoiceModel::query()->create($invoiceRequest->all()); $invoiceId = $invoice->id; } else { $invoiceId = $sample->invoice->id; $editInvoice = $this->invoiceModel::query()->find($sample->invoice->id); $deposit = $editInvoice->deposit; $bank_deposit = $editInvoice->bank_deposit; $editInvoice->total = $total * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1); $editInvoice->discount = $discounts * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1); $editInvoice->gross_total = number_format($grossTotal * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1),2, '.', ''); $editInvoice->balance = number_format(($grossTotal-($deposit+$bank_deposit)),2, '.', ''); $editInvoice->save(); $this->invoiceDetailModel::query()->where('invoice_id', $sample->invoice->id)->delete(); } // Refresh Invoice Detail $invoiceDetailRequest = collect($invoiceDetail); $items = $invoiceDetailRequest->map(function ($row) use($invoiceId, $labSettings) { $invoiceDetailRow = $this->invoiceDetailModel::query()->create([ 'invoice_id' => $invoiceId, 'test_sample_id' => $row['test_sample_id'], 'discount_type' => $row['item_discount_type'], 'discount' => $row['item_discount'], 'test_name' => $row['group_result'], 'qty' => 1, 'unit_price' => $row['usd_price'] * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1), ]); return []; }); } /** * Create or Update Invoice in case invoice generation mode is auto end */ DB::commit(); return response()->json(['success' => true, 'message' => __('sample.assign_tests_success')]); } catch (\Exception $e){ Log::error($e); DB::rollBack(); return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); } } public function storeSampleTestResult(Request $request){ set_time_limit(6000); ini_set('memory_limit', '10240M'); if(!GlobalController::user_can(Auth::user()->role_id, ['add_result', 'update_result', 'delete_result'])) return false; $validator = \Validator::make($request->all(), ['sample_id' => 'required', 'ref_test_sample_id' => 'nullable', 'ref_test_sample_id_value' => 'nullable', 'test_samples_to_hide' => 'nullable', 'ref_test_sample_performer' => 'nullable']); if ($validator->fails()) {return response()->json(['errors'=>$validator->errors()->all()]);} DB::beginTransaction(); try{ $sample = $this->model::query()->find($request->sample_id); $sample->update([ BaseModel::UPDATED_AT_FIELD => date('Y-m-d H:i:s'), BaseModel::UPDATED_BY_FIELD => Auth::id() ]); // add test result if(isset($request->ref_test_sample_id)){ $data = collect($request->ref_test_sample_id); $ref_test_sample_id_value = collect($request->ref_test_sample_id_value); $ref_test_date = collect($request->ref_test_sample_test_date); $ref_performed_by = collect($request->ref_test_sample_performer); $ref_test_sample_comment = collect($request->ref_test_sample_comment); $vars = $data->map(function ($val, $key) use($request, $ref_test_sample_id_value, $ref_test_date, $ref_performed_by, $ref_test_sample_comment){ $this->testResultModel::query()->where(['organization_id' => $this->baseOrganizationId, 'sample_id' => $request->sample_id, 'test_sample_id' => $val])->update([ 'test_result' => @$ref_test_sample_id_value[$key], 'test_date' => @$ref_test_date[$key], 'performed_by' => @$ref_performed_by[$key], 'comment' => $ref_test_sample_comment[$key], ]); }); } if(isset($request->ref_test_sample_id___)){ $datas = collect($request->ref_test_sample_id___); //$ref_test_date = collect($request->ref_test_sample_test_date); //$ref_performed_by = collect($request->ref_test_sample_performer); $ref_test_sample_comment_ = collect($request->ref_test_sample_comment___); $vars = $datas->map(function ($val_, $key_) use($request, $ref_test_sample_comment_){ $this->testResultModel::query()->where(['organization_id' => $this->baseOrganizationId, 'sample_id' => $request->sample_id, 'test_sample_id' => $val_])->update([ //'test_date' => @$ref_test_date[$key], //'performed_by' => @$ref_performed_by[$key], 'comment' => $ref_test_sample_comment_[$key_], ]); }); } // set hide test if(isset($request->test_samples_to_hide)){ $this->testResultModel::query()->where(['organization_id' => $this->baseOrganizationId, 'sample_id' => $request->sample_id]) ->whereNotIn('test_sample_id', $request->test_samples_to_hide)->update(['is_show' => 1]); foreach ($request->test_samples_to_hide as $val){ $this->testResultModel::query()->where(['organization_id' => $this->baseOrganizationId, 'sample_id' => $request->sample_id, 'test_sample_id' => $val])->update([ 'is_show' => 0 ]); } } else{ $this->testResultModel::query()->where(['organization_id' => $this->baseOrganizationId, 'sample_id' => $request->sample_id])->update(['is_show' => 1]); } // organism result if(isset($request->possible_result)){ $possible_results = collect(json_decode($request->possible_result))->flatten(1); //$organismIds = $possible_results->pluck('organism_id')->toArray(); foreach ($possible_results as $k=>$org){ $organismIds = $possible_results->filter(function($item) use($org){ return $item->test_sample_id == $org->test_sample_id; })->pluck('organism_id')->toArray(); // change on 08/Sep/2023 to fixed issue save result success but no data affect //$testResult = $this->testResultModel::query()->where(['test_sample_id' => $org->test_sample_id, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderByDesc('id')->limit(1)->first(); $testResult = $this->testResultModel::query()->where(['test_sample_id' => $org->test_sample_id, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId, 'sample_id' => $request->sample_id])->orderByDesc('id')->limit(1)->first(); if(count($organismIds)>0){ $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organization_id' => $this->baseOrganizationId])->whereNotIn('organism_id', $organismIds)->update(['record_status_id' => 0]); } $organismResult = $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organism_id' => $org->organism_id, BaseModel::RECORD_STATUS_FIELD =>RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId])->first(); //$organismResultId = 0; if(!empty($organismResult)){ $organismResultId = $organismResult->id; $this->organismResultModel::query()->find($organismResult->id)->update([ 'quantity_id' => (int)$org->quantity_id, 'contaminant' => $org->contaminant ]); } else{ $savedOrg = $this->organismResultModel::query()->create([ 'test_result_id' => $testResult->id, 'organism_id' => $org->organism_id, 'quantity_id' => (int)$org->quantity_id, 'contaminant' => $org->contaminant, 'organization_id' => $this->baseOrganizationId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, BaseModel::CREATED_AT => date('Y-m-d H:i:s') ]); $organismResultId = $savedOrg->id; } if(isset($request->anti_result)){ $anti_result = collect(json_decode($request->anti_result))->flatten(1); if(in_array($org->test_organism_id, $anti_result->pluck('test_organism_id')->unique()->flatten(1)->toArray())){ $this->antibioticResultModel::query()->where('organism_result_id', $organismResultId)->delete(); } foreach ($anti_result as $j=>$anti){ if($anti->test_organism_id == $org->test_organism_id && $anti->sensitive !="") { $this->antibioticResultModel::query()->updateOrCreate([ 'organism_result_id' => $organismResultId, 'antibiotic_id' => $anti->antibiotic_id ], [ 'organism_result_id' => $organismResultId, 'antibiotic_id' => $anti->antibiotic_id, 'disk_diffusion' => $anti->disk_diffusion, 'mic' => $anti->mic, 'sensitive' => $anti->sensitive, 'is_hide' => $anti->is_hide, BaseModel::CREATED_AT_FIELD => date('Y-m-d H:i:s'), BaseModel::CREATED_BY_FIELD => Auth::id(), BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE ]); } } } } } DB::commit(); return response()->json(['success'=> true , 'message' => 'Sample result already saved.']); } catch (\Exception $e){ DB::rollBack(); Log::error($e); return response()->json(['success'=> false , 'error' => 'Failed while update sample result.']); } } public function getSampleTest($sample_id){ try{ $sample = $this->model::with(['patient','sample_source','sample_details','sample_tests', 'physician'])->find($sample_id); return response()->json(['success'=> true , 'data' => new SampleResource($sample)]); } catch (\Exception $e){ return response()->json(['success'=> false , 'message' => $e->getMessage()]); } } function makeInvoice($sampleId){ try{ $resultItems = DB::select(' SELECT d.`id` AS department_id, d.`name_en` AS department_name, d.weight as dweight, st.`id` AS sample_type_id, st.weight as sweight, st.`name_en` AS sample_type, ts.`id` AS test_sample_id, ts.`heading_id` AS parent_id, ts.`field_type`, ts.`usd_price`, ts.group_result, ts.description, t.`id` AS test_id, t.`name_en` AS test_name, tr.id as test_result_id, pct.`commission_type`, ifnull(pct.`commission_rate`, 0.00) as commission_rate, ifnull(pct.`partner_price`, 0.00) as partner_price, ts.weight FROM samples s INNER JOIN test_results tr ON tr.`sample_id` = s.`id` AND s.`organization_id` = tr.`organization_id` INNER JOIN test_samples ts ON ts.id = tr.`test_sample_id` and ts.organization_id = tr.organization_id INNER JOIN tests t ON t.`id` = ts.`test_id` INNER JOIN sample_types st ON st.`id` = ts.`sample_type_id` INNER JOIN departments d ON d.`id` = st.`department_id` LEFT JOIN `physician_commisssion` AS pct ON pct.`test_sample_id` = ts.`id` AND pct.`physician_id` = s.`physician_id` WHERE s.`id` = '.$sampleId.' AND s.`organization_id`= '.$this->baseOrganizationId.' AND tr.`record_status_id` = '.BaseModel::RECORD_STATUS_ACTIVE.' AND LENGTH(ts.group_result)>0 AND ts.usd_price>0 ORDER BY d.`weight`, st.`weight`, ts.`weight`'); $departmentArray = array(); foreach ($resultItems as $row){ $net_amount = number_format((((!empty($row->commission_type) ? $row->commission_type : ((object) $this->location())->discount_type)) ==2 ? (($row->usd_price - $row->partner_price) - $row->commission_rate) : (($row->usd_price - $row->partner_price) * (1-$row->commission_rate/100))),3); $testItemArray = array( 'test_sample_id' => (string)$row->test_sample_id, 'test_id' => $row->test_id, 'test_name' => $row->test_name, 'closed_parent_id' => (string) (int)$row->parent_id, 'field_type' => (string) $row->field_type, 'usd_price' => $row->usd_price, 'group_result' => (string) $row->group_result, 'item_discount_type' => (!empty($row->commission_type) ? $row->commission_type : ((object) $this->location())->discount_type), 'item_discount_rate' => $row->commission_rate, 'item_discount' => $net_amount, 'discount_price' => ($row->usd_price - $net_amount) ); $departmentArray[] = $testItemArray; } return $departmentArray; } catch (\Exception $e){ return $e->getMessage(); } } function printRecorder(Request $request){ DB::beginTransaction(); try{ $patientSample = $this->model::query()->where(['id' => $request->uid, 'organization_id' => $this->baseOrganizationId])->first(); if($patientSample->is_printed==0) { $patientSample->update( [ 'is_printed' => 1, 'printed_at' => date('Y-m-d H:i:s'), 'printed_by' => Auth::id() ] ); } DB::commit(); return response()->json(['success'=> true , 'data' => $patientSample]); } catch (\Exception $e){ DB::rollBack(); return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); } } public function generateInvoiceId($invoiceDate){ $prefix = date('y',strtotime($invoiceDate)); $invoiceCount = $this->invoiceModel::query()->where('organization_id', $this->baseOrganizationId)->whereRaw('year(invoice_date) ="'. date('Y',strtotime($invoiceDate)).'"')->count(); return 'I-'.$this->base['short_name'].'-'.$prefix.'-'.(str_pad(($invoiceCount+1),5,'0',STR_PAD_LEFT)); } function temporarySaveOrganismResult($sampleId, $testSampleId, $organismId){ // if(Auth::user()->id==1){ DB::beginTransaction(); try{ $testResult = $this->testResultModel::query()->where(['test_sample_id' => $testSampleId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId, 'sample_id' => $sampleId])->orderByDesc('id')->limit(1)->first(); $organismResult = $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organism_id' => $organismId, BaseModel::RECORD_STATUS_FIELD =>RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId])->first(); if(empty($organismResult)){ $savedOrg = $this->organismResultModel::query()->create([ 'test_result_id' => $testResult->id, 'organism_id' => $organismId, 'quantity_id' => 0, 'contaminant' => 0, 'organization_id' => $this->baseOrganizationId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, BaseModel::CREATED_AT => date('Y-m-d H:i:s') ]); } DB::commit(); return response()->json(['success'=> true , 'message' => 'organisam_result_saved']); } catch (\Exception $e){ DB::rollBack(); return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); } //} } function temporarySaveOrganismResultQuantity($sampleId, $testSampleId, $organismId, $qtyId){ //if(Auth::user()->id==1){ DB::beginTransaction(); try{ $testResult = $this->testResultModel::query()->where(['test_sample_id' => $testSampleId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId, 'sample_id' => $sampleId])->orderByDesc('id')->limit(1)->first(); $organismResult = $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organism_id' => $organismId, BaseModel::RECORD_STATUS_FIELD =>RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId])->first(); if(!empty($organismResult)){ $savedOrg = $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organism_id' => $organismId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'organization_id' => $this->baseOrganizationId]) ->update([ 'quantity_id' => $qtyId ]); } DB::commit(); return response()->json(['success'=> true , 'message' => 'organisam_result_saved_by_addmin']); } catch (\Exception $e){ DB::rollBack(); return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); } //} } public function uploadAttachmentResult(Request $request){ try { $image = $request->file('image'); $imageName = Str::uuid()->toString().'.' . $image->getClientOriginalExtension(); $image->move(public_path('storage/images/attachment_lab_result'), $imageName); return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => array('result' =>$imageName)]); }catch (\Exception $e){ return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); } } function sendLabResultLink(Request $request, $patientId, $sampleId) { try { $telegram = new Api(env('TELEGRAM_BOT_TOKEN')); $sample = $this->model::with(['patient','sample_source','lab'])->where(['id' => $sampleId])->first(); $text_message = "๐Ÿงช ".$sample->lab->name_en." Labo Result\n" ."------------------------------------------------\n" ."Patient Name:".$sample->patient->name_en."\n" ."Age: ".Helpers::getAge($sample->patient->dob, $sample->admission_date)." (".Helpers::getGenderFull($sample->patient->gender).")\n" ."Patients ID: ".$sample->patient->patient_uuid."\n" ."Sample Source: ".$sample->sample_source->name_en."\n" ."๐Ÿ‘‰ Click To View Result\n" ."------------------------------------------------\n" ."Date: ".date("D d/m/Y H:i"); if($request->target_receiver=='patient'){ $chat = DB::table('patient_telegram')->where('patient_id', $patientId)->first(); if ($chat) { $telegram->sendMessage([ 'chat_id' => $chat->chat_id, 'text' => $text_message, 'parse_mode' => 'HTML', ]); } } else{ $sample = $this->model::with(['sample_source.telegramChatId'])->find($sampleId); if(isset($sample->sample_source->telegramChatId) && !empty($sample->sample_source->telegramChatId)){ $telegram->sendMessage([ 'chat_id' => $sample->sample_source->telegramChatId->chat_id, 'text' => $text_message, 'parse_mode' => 'HTML', ]); } } return response()->json(['success'=> true , 'message' => 'Laboroatory results have been sent!']); }catch (\Exception $e){ return response()->json(['success'=> false , 'message' => 'Laboroatory results sent failed!']); //return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); } } public function updateSampleResultTemplate(Request $request){ try{ $patientSample = $this->model::query()->where(['id' => $request->uid, 'organization_id' => $this->baseOrganizationId])->first(); $patientSample->update(['result_template_id' => $request->result_template_id]); return response()->json(['success'=> true , 'message' => 'Sample result template already saved!']); } catch (\Exception $e){ return response()->json(['success'=> false , 'message' => 'Failed while saving sample result template']); } } }