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 @@
-
+
-
+
diff --git a/resources/views/pathogen.blade.php b/resources/views/pathogen.blade.php
new file mode 100644
index 0000000..907450d
--- /dev/null
+++ b/resources/views/pathogen.blade.php
@@ -0,0 +1,226 @@
+
+
+
+ @include('layout.header')
+
+
+
+
+@include('layout.common_script')
+
+
+
+
+
+
+
diff --git a/routes/web.php b/routes/web.php
index 0f42951..b8043e5 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -11,6 +11,7 @@ use App\Http\Controllers\DashboardController;
use App\Http\Controllers\IncidentTypeController;
use App\Http\Controllers\InvoiceController;
use App\Http\Controllers\OrganismController;
+use App\Http\Controllers\PathogenController;
use App\Http\Controllers\PatientController;
use App\Http\Controllers\PatientTypeController;
use App\Http\Controllers\PhysicianController;
@@ -154,6 +155,14 @@ Route::middleware(['auth'])->group(function () {
Route::post('sample-container.delete', [ContainerTypeController::class, 'delete'])->middleware(VerifyBaseLab::class);
Route::post('sample-container.restore', [ContainerTypeController::class, 'restore'])->middleware(VerifyBaseLab::class);
+ Route::get('pathogen', [PathogenController::class, 'index'])->name('pathogen')->middleware(VerifyBaseLab::class);
+ Route::get('pathogen/search', [PathogenController::class, 'index'])->name('pathogen.search')->middleware(VerifyBaseLab::class);
+ Route::post('pathogen.save', [PathogenController::class, 'save'])->middleware(VerifyBaseLab::class);
+ Route::post('pathogen.get', [PathogenController::class, 'get'])->middleware(VerifyBaseLab::class);
+ Route::post('pathogen.update', [PathogenController::class, 'update'])->middleware(VerifyBaseLab::class);
+ Route::post('pathogen.delete', [PathogenController::class, 'delete'])->middleware(VerifyBaseLab::class);
+ Route::post('pathogen.restore', [PathogenController::class, 'restore'])->middleware(VerifyBaseLab::class);
+
Route::get('user', [UserController::class, 'index'])->name('user')->middleware(VerifyBaseLab::class);
Route::get('lab-users', [UserController::class, 'labUsers'])->name('lab_user')->middleware(VerifyBaseLab::class);
Route::get('user/search', [UserController::class, 'index'])->name('user.search')->middleware(VerifyBaseLab::class);