From 907b3b2aec32d91b31a0d5c55d85e00b4d6c4bda Mon Sep 17 00:00:00 2001 From: pcalengratha Date: Wed, 1 Jul 2026 16:41:06 +0700 Subject: [PATCH] pathogen --- app/Http/Controllers/PathogenController.php | 143 +++++++++++++ app/Models/Organism.php | 27 --- app/Models/Pathogen.php | 51 +++++ app/Models/SampleType.php | 38 ---- public/storage/assets/js/admin/concept.js | 2 +- public/storage/assets/js/admin/pathogen.js | 128 +++++++++++ resources/views/layout/sidebar.blade.php | 6 +- resources/views/pathogen.blade.php | 226 ++++++++++++++++++++ routes/web.php | 9 + 9 files changed, 561 insertions(+), 69 deletions(-) create mode 100644 app/Http/Controllers/PathogenController.php delete mode 100644 app/Models/Organism.php create mode 100644 app/Models/Pathogen.php delete mode 100644 app/Models/SampleType.php create mode 100644 public/storage/assets/js/admin/pathogen.js create mode 100644 resources/views/pathogen.blade.php diff --git a/app/Http/Controllers/PathogenController.php b/app/Http/Controllers/PathogenController.php new file mode 100644 index 0000000..cfd447d --- /dev/null +++ b/app/Http/Controllers/PathogenController.php @@ -0,0 +1,143 @@ +baseOrganizationId = Session::get('base_organization_id'); + $this->base = Session::get('base_organization'); + $this->model = new Pathogen(); + $this->conceptModel = new Concept(); + } + + public function index(Request $request){ + $recordStatusCondition = Auth::id()==1 ? [RecordStatusEnum::DELETE, RecordStatusEnum::ACTIVE] : [RecordStatusEnum::ACTIVE]; + $concepts = $this->conceptModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)->get(); + $pathogens = $this->model::with(['riskGroup', 'bsl', 'pathogenType'])->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition) + ->when(!empty($request->kword), function ($query) use($request){ + $query->whereRaw("replace(scientific_name, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereRaw("replace(common_name, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereRaw("replace(strain, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT,'desc')->paginate(config('nrml.pagination.perpage', 10)); + return view('pathogen', ['pathogens' => $pathogens, 'concepts' => $concepts]); + } + + public function save(Request $request){ + try { + + $validator = \Validator::make($request->all(), [ + 'pathogen_category_concept_id' => 'required', + 'scientific_name' => 'required', + 'common_name' => 'required', + 'risk_group_concept_id' => 'required', + 'biosafety_level_concept_id' => 'required', + ]); + if ($validator->fails()) { + return response()->json(['success' => false, 'message' => __('building.create_fail'), 'errors' => $validator->errors()->all()]); + } + $data = array( + 'pathogen_category_concept_id' => $request->pathogen_category_concept_id, + 'scientific_name' => $request->scientific_name, + 'common_name' => $request->common_name, + 'risk_group_concept_id' => $request->risk_group_concept_id, + 'biosafety_level_concept_id' => $request->biosafety_level_concept_id, + 'infectious_dose' => $request->infectious_dose, + 'transmission_mode' => $request->transmission_mode, + 'storage_requirement' => $request->storage_requirement, + 'min_temp' => $request->min_temp, + 'max_temp' => $request->max_temp, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => Auth::id() + ); + $this->model::query()->insert($data); + return response()->json(['success' => true, 'message' => __('laboratory.create_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.create_fail'), 'errors' => $e->getMessage()]); + } + } + + + public function update(Request $request){ + try { + $validator = \Validator::make($request->all(), [ + 'pathogen_category_concept_id' => 'required', + 'scientific_name' => 'required', + 'common_name' => 'required', + 'risk_group_concept_id' => 'required', + 'biosafety_level_concept_id' => 'required', + ]); + if ($validator->fails()) return response()->json(['errors' => $validator->errors()->all()]); + $data = array( + 'pathogen_category_concept_id' => $request->pathogen_category_concept_id, + 'scientific_name' => $request->scientific_name, + 'common_name' => $request->common_name, + 'risk_group_concept_id' => $request->risk_group_concept_id, + 'biosafety_level_concept_id' => $request->biosafety_level_concept_id, + 'infectious_dose' => $request->infectious_dose, + 'transmission_mode' => $request->transmission_mode, + 'storage_requirement' => $request->storage_requirement, + 'min_temp' => $request->min_temp, + 'max_temp' => $request->max_temp, + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->model::query()->where('id', $request->pathogen_id)->update($data); + return response()->json(['success' => true, 'message' => __('laboratory.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $lab = $this->model::query()->where('id', $request->pathogen_id)->get()->first(); + return response()->json(['success' => true, 'message' => __('laboratory.get_success'), 'data' => $lab]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.get_fail'), 'errors' => $e->getMessage()]); + } + + } + + public function delete(Request $request){ + try{ + $this->model::query()->where('id', $request->pathogen_id)->update(array( + BaseModel::DELETED_AT_FIELD => date('Y-m-d H:i:s'), + BaseModel::DELETED_BY_FIELD => Auth::id(), + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE + )); + return response()->json(['success' => true, 'message' => __('laboratory.delete_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.delete_fail'), 'errors' => $e->getMessage()]); + } + + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->pathogen_id)->update(array(BaseModel::RECORD_STATUS_FIELD=> RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('laboratory.restore_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Models/Organism.php b/app/Models/Organism.php deleted file mode 100644 index c9d2cd8..0000000 --- a/app/Models/Organism.php +++ /dev/null @@ -1,27 +0,0 @@ -belongsTo('App\Models\Organization', 'organization_id','id'); - } - -} diff --git a/app/Models/Pathogen.php b/app/Models/Pathogen.php new file mode 100644 index 0000000..8e6e303 --- /dev/null +++ b/app/Models/Pathogen.php @@ -0,0 +1,51 @@ +belongsTo(Concept::class, 'pathogen_category_concept_id', 'id'); + } + + public function riskGroup(){ + return $this->belongsTo(Concept::class, 'risk_group_concept_id', 'id'); + } + + public function bsl(){ + return $this->belongsTo(Concept::class, 'biosafety_level_concept_id', 'id'); + } + + +} diff --git a/app/Models/SampleType.php b/app/Models/SampleType.php deleted file mode 100644 index 5ee90c6..0000000 --- a/app/Models/SampleType.php +++ /dev/null @@ -1,38 +0,0 @@ -belongsTo(Department::class, 'department_id'); - } - - public function testSamples(){ - return $this->hasMany(TestSample::class, 'sample_type_id') - ->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) - //->where('organization_id', Session::get('base_organization_id')) - ->orderBy('weight'); - } - -} diff --git a/public/storage/assets/js/admin/concept.js b/public/storage/assets/js/admin/concept.js index c83a5df..6659ebf 100644 --- a/public/storage/assets/js/admin/concept.js +++ b/public/storage/assets/js/admin/concept.js @@ -68,7 +68,7 @@ function restore_lab(concept_id){ }, success:function(res){ handleMessage(res.success, res.message) - if(res.success) {setTimeout(function () {location.reload()}, messageDuration)} + if(res.success == true) {setTimeout(function () {location.reload()}, messageDuration)} } }) diff --git a/public/storage/assets/js/admin/pathogen.js b/public/storage/assets/js/admin/pathogen.js new file mode 100644 index 0000000..4eef209 --- /dev/null +++ b/public/storage/assets/js/admin/pathogen.js @@ -0,0 +1,128 @@ + +$("#btnSave").on('click',function(e){ + e.preventDefault(); + let pathogen_id = $('#pathogen_id').val(); + url = parseInt(pathogen_id) === 0 ? save_url : update_url; + $.ajax({ + url: url, + type:"POST", + data:{ + "_token": csrf_token, + pathogen_id : pathogen_id, + pathogen_category_concept_id: $('#pathogen_category_concept_id').val(), + scientific_name: $('#scientific_name').val(), + common_name: $('#common_name').val(), + risk_group_concept_id: $('#risk_group_concept_id').val(), + biosafety_level_concept_id: $('#biosafety_level_concept_id').val(), + infectious_dose: $('#infectious_dose').val(), + transmission_mode: $('#transmission_mode').val(), + storage_requirement: $('#storage_requirement').val(), + min_temp: $('#min_temp').val(), + max_temp: $('#max_temp').val(), + }, + success:function(res){ + handleMessage(res.success, res.message) + if(res.success){ setTimeout(function () {location.reload()}, messageDuration)} + } + }); +}); + +function delete_lab(pathogen_id){ + Swal.fire({ + text: confirm_delete_record, + icon: 'question', + showCancelButton: true, + cancelButtonClass:'danger', + confirmButtonText: confirm_ok_delete, + cancelButtonText: confirm_cancel + }).then((result) => { + if (result.value) { + $.ajax({ + url: delete_url, + method:'POST', + data:{ + "_token": csrf_token, + pathogen_id : pathogen_id, + }, + success:function(res){ + handleMessage(res.success, res.message) + if(res.success) {setTimeout(function () {location.reload()}, messageDuration)} + } + }) + + } + }); +} + +function restore_lab(pathogen_id){ + Swal.fire({ + text: confirm_restore_record, + icon: 'question', + showCancelButton: true, + cancelButtonClass:'danger', + confirmButtonText: confirm_ok_restore, + cancelButtonText: confirm_cancel_restore, + }).then((result) => { + if (result.value) { + $.ajax({ + url: restore_url, + method:'POST', + data:{ + "_token": csrf_token, + pathogen_id : pathogen_id, + }, + success:function(res){ + handleMessage(res.success, res.message) + if(res.success) { setTimeout(function () {location.reload()}, messageDuration)} + } + }) + + } + }); +} + +$('#modal-pathogen').on('show.bs.modal', function (event) { + var button = $(event.relatedTarget) // Button that triggered the modal + var action = button.data('action') // Extract info from data-* attributes + var modal = $(this); + if(action === "new"){ + // Clear inputs + modal.find('.modal-body input').val(""); + modal.find('.modal-body input[name="pathogen_id"]').val(0); + modal.find('.modal-body select[name="pathogen_category_concept_id"]').val("").trigger('change'); + modal.find('.modal-body select[name="risk_group_concept_id"]').val("").trigger('change'); + modal.find('.modal-body select[name="biosafety_level_concept_id"]').val("").trigger('change'); + modal.find('.modal-title').html(modal_add_title); + }else if(action === "edit"){ + pathogen_id = button.data('pathogen_id'); + modal.find('.modal-body input[name="pathogen_id"]').val(pathogen_id); + modal.find('.modal-title').html(modal_edit_title); + //e.preventDefault(); + $.ajax({ + url: get_url, + type:"POST", + data:{ + "_token": csrf_token, + pathogen_id: pathogen_id, + }, + success:function(res){ + if(res.success) { + let data = res.data; + modal.find('.modal-body input[name="scientific_name"]').val(data.scientific_name); + modal.find('.modal-body input[name="common_name"]').val(data.common_name); + modal.find('.modal-body input[name="infectious_dose"]').val(data.infectious_dose); + modal.find('.modal-body input[name="transmission_mode"]').val(data.transmission_mode); + modal.find('.modal-body input[name="storage_requirement"]').val(data.storage_requirement); + modal.find('.modal-body input[name="min_temp"]').val(data.min_temp); + modal.find('.modal-body input[name="max_temp"]').val(data.max_temp); + modal.find('.modal-body select[name="risk_group_concept_id"]').val(data.risk_group_concept_id).trigger('change'); + modal.find('.modal-body select[name="pathogen_category_concept_id"]').val(data.pathogen_category_concept_id).trigger('change'); + modal.find('.modal-body select[name="biosafety_level_concept_id"]').val(data.biosafety_level_concept_id).trigger('change'); + } else{ + handleMessage(res.success, res.message) + } + }, + }); + } +}) + diff --git a/resources/views/layout/sidebar.blade.php b/resources/views/layout/sidebar.blade.php index f28dd49..21a3919 100644 --- a/resources/views/layout/sidebar.blade.php +++ b/resources/views/layout/sidebar.blade.php @@ -79,16 +79,16 @@ -