Files
hpt_inventory/app/Http/Controllers/SampleController.php
2026-06-15 11:25:16 +07:00

877 lines
50 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Helpers\Helpers;
use App\Enums\RecordStatusEnum;
use App\Enums\UtilEnum;
use App\Http\Controllers\Helper\GlobalController;
use App\Http\Requests\SampleCreateRequest;
use App\Http\Requests\SampleDetailCreateRequest;
use App\Http\Requests\UpdateRequests\SampleUpdateRequest;
use App\Http\Resources\SampleResource;
use App\Models\AntibioticResult;
use App\Models\BaseModel;
use App\Models\OrganismResult;
use App\Models\Patient;
use App\Models\Physician;
use App\Models\RejectComment;
use App\Models\Sample;
use App\Models\SampleDetail;
use App\Models\SampleSource;
use App\Models\TestGroup;
use App\Models\TestResult;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
use Telegram\Bot\Api;
use App\Models\Invoice;
use App\Models\InvoiceDetail;
use App\Models\LabConfigure;
class SampleController extends Controller
{
protected $model;
protected $physicianModel;
protected $sampleSourceModel;
protected $patientModel;
protected $rejectCommentModel;
protected $sampleDetailModel;
protected $testResultModel;
protected $testGroupModel;
protected $organismResultModel;
protected $antibioticResultModel;
protected $baseOrganizationId;
protected $base;
protected $invoiceModel;
protected $invoiceDetailModel;
protected $laboratoryConfigures;
public function __construct(Sample $sampleModel, Physician $physicianModel, RejectComment $rejectCommentModel, TestGroup $testGroupModel,
SampleSource $sampleSourceModel, Patient $patientModel, SampleDetail $sampleDetailModel, TestResult $testResultModel,
OrganismResult $organismResultModel, AntibioticResult $antibioticResultModel, Invoice $invoiceModel, InvoiceDetail $invoiceDetailModel, LabConfigure $laboratoryConfigures
){
$this->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('labis.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"
."👉 <a href='https://vechsa.com/shared/lab-result/{$sampleId}'>Click To View Result</a>\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']);
}
}
}