CRUD laboratory

This commit is contained in:
2026-06-16 15:06:11 +07:00
parent f4c7af85e9
commit 09de1c3e92
12 changed files with 67 additions and 70 deletions

View File

@@ -32,8 +32,7 @@ class RoleController extends Controller
public function index(Request $request){
if(!GlobalController::user_can(Auth::user()->role_id, ['view_user_role'])) return redirect(url('my-profile'));
$recordStatusCondition = Auth::id()==1 ? [RecordStatusEnum::DELETE, RecordStatusEnum::ACTIVE] : [RecordStatusEnum::ACTIVE];
$roles = $this->roleModel::with('lab')->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition)
->where('organization_id', $this->baseOrganizationId)
$roles = $this->roleModel::query()->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition)
->whereNotIn('id', [UtilEnum::ADMINISTRATOR_ROLE])
->when(!empty($request->kword), function ($roles) use($request){
$roles->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'");

View File

@@ -62,17 +62,15 @@ class UserController extends Controller
$this->labs = parent::getAccessAbleLabs();
$roles = $this->roleModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)
->whereNotIn('id', [UtilEnum::ADMINISTRATOR_ROLE])->get();
$sample_sources = $this->sampleSourceModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)
->where('organization_id', Session::get('base_organization_id'))->get();
$users = $this->userModel::with(['role','lab_covers'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)
->whereIn('id', $this->labs->pluck('labUsers')->flatten()->pluck('user_id')->toArray())
$users = $this->userModel::with(['role','userOrganizations'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)
->whereIn('id', $this->labs->pluck('userOrganizations')->flatten()->pluck('user_id')->toArray())
->whereNotIn('role_id', [UtilEnum::ADMINISTRATOR_ROLE])
->when(!empty($request->kword), function($users) use ($request) {
$users->whereRaw("replace(name, ' ','') like '%".str_replace(" ","",$request->kword)."%'")
->orWhereRaw("replace(email, ' ','') like '%".str_replace(" ","",$request->kword)."%'");
})->orderBy(BaseModel::CREATED_AT,'desc')->paginate(config('labis.pagination.perpage', 10));
return view('user_account', ['users' => $users, 'roles' => $roles, 'labs' => $this->labs, 'sample_sources' => $sample_sources]);
return view('user_account', ['users' => $users, 'roles' => $roles, 'labs' => $this->labs]);
}
public function save(Request $request){
@@ -82,16 +80,13 @@ class UserController extends Controller
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required',
'role_id' => 'required',
'sample_source_id' => 'nullable'
'role_id' => 'required'
]);
if ($validator->fails()) return response()->json(['success' => false, 'message' => __('user_account.create_fail'), 'errors' => $validator->errors()->all()]);
$data = array(
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'is_manager' => ($request->role_id==3 ? 1: 0),
'sample_source_id' => $request->sample_source_id,
'role_id' => $request->role_id,
'created_at' => date('Y-m-d H:i:s'),
'created_by' => Auth::id(),
@@ -120,8 +115,6 @@ class UserController extends Controller
'name' => $request->name,
'email' => $request->email,
'role_id' => $request->role_id,
'is_manager' => ($request->role_id==3 ? 1: 0),
'sample_source_id' => $request->sample_source_id,
'updated_at' => date('Y-m-d H:i:s'),
'updated_by' => Auth::id()
);
@@ -155,7 +148,7 @@ class UserController extends Controller
public function get(Request $request){
try{
$user = $this->userModel::with(['lab_covers'])->find($request->uid);
$user = $this->userModel::with(['userOrganizations'])->find($request->uid);
return response()->json(['success' => true, 'message' => __('user_account.get_success'), 'data' => $user]);
} catch (\Exception $e){
return response()->json(['success' => false, 'message' => __('user_account.get_fail'), 'errors' => $e->getMessage()]);
@@ -186,7 +179,7 @@ class UserController extends Controller
if(!GlobalController::user_can(Auth::user()->role_id, ['assign_lab'])) return false;
$validator = \Validator::make($request->all(), [ 'uid' => 'required']);
if ($validator->fails()) return response()->json(['success' => false, 'message' => __('user_account.assign_lab_fail'), 'errors'=>$validator->errors()->all()]);
$this->userLabCover::query()->where('user_id', $request->uid)
$this->userOrganizations::query()->where('user_id', $request->uid)
->update(['end_date' => date('Y-m-d'), BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE, BaseModel::UPDATED_AT_FIELD => date('Y-m-d H:i:s'), BaseModel::UPDATED_BY_FIELD =>Auth::id()]);
$data = array();
foreach ($request->organization_ids as $organization_id){
@@ -198,7 +191,7 @@ class UserController extends Controller
'created_by' => Auth::id()
);
}
$this->userLabCover::query()->insert($data);
$this->userOrganizations::query()->insert($data);
return response()->json(['success' => true, 'message' => __('user_account.assign_lab_success')]);
} catch (\Exception $e){
return response()->json(['success' => false, 'message' => __('user_account.assign_lab_fail'), 'errors' => $e->getMessage()]);

View File

@@ -1,7 +1,7 @@
<?php
return [
'table_title' => 'Organization',
'table_title' => 'Laboratory',
'search_placeholder' => 'Organization name, address...',
'table_no' => 'No.',
'table_name_kh' => 'Name Khmer',
@@ -11,14 +11,14 @@ return [
'table_labs' => 'Labs',
'table_status' => 'Status',
'table_action' => 'Actions',
'form_add_tittle' => 'New Organization',
'form_add_tittle' => 'New Laboratory',
'form_name' => 'Full-Name',
'form_login_email' => 'Login-Email',
'form_ismnager' => 'Lab Manager',
'form_edit_tittle' => 'Edit Organization Information',
'form_edit_tittle' => 'Edit Laboratory Information',
'form_system_role' => 'System-Role',
'form_lab_cover' => 'Organization Coverage',
'form_laboratory' => 'Organization',
'form_lab_cover' => 'Laboratory Coverage',
'form_laboratory' => 'Laboratory',
'form_select_all_lab' => 'Select All Labs',
'form_password' => 'Password',
'form_address_en' => 'Address-En',

View File

@@ -63,7 +63,7 @@ return [
'sample_source_distribution' => 'ចំនួនសំណាកតាមប្រភពសំណាក(ឆ្នាំនេះ)',
'manage_user_accounts' => 'គ្រប់គ្រងគណនីប្រើប្រាស់',
'manage_user_roles' => 'គ្រប់គ្រងតួនាទីអ្នកប្រើប្រាស់',
'manage_user_roles' => 'គ្រប់គ្រងតួនាទី',
'laboratory_settings' => 'គ្រប់គ្រងមន្ទីរពិសោធន៍',
'activity_logs' => 'កំណត់ហេតុប្រតិបត្តិការណ៍',
'btn_save_patient_add_new_sample' => 'រក្សាទុក និងបង្កើតសំណាកថ្មី',

View File

@@ -642,8 +642,9 @@ div select{
display: inline-block;
width: 5px;
height: 30px;
background-color: #0f4ebd !important;
background-color: #0cb55f !important;
}
.bar-loader {
width: auto !important;
}

View File

@@ -11,12 +11,10 @@ $("#btnSave").on('click',function(e){
uid : data_id,
name: $('#name').val(),
email: $('#email').val(),
is_manager: isManager,
role_id: $('#role-id').val(),
password: $('#password').val(),
default_manager: $('#default-manager').val(),
signature: $('#signature').val(),
sample_source_id: ($('#role-id').val() == 6 ? $('#sample-source-id').val():0)
},
success:function(res){
handleMessage(res.success, res.message)
@@ -106,7 +104,7 @@ $('#modal-user').on('show.bs.modal', function (event) {
modal.find('.modal-body input[name="name"]').val(data.name);
modal.find('.modal-body input[name="email"]').val(data.email);
modal.find('.modal-body input[name="password"]').val('***************');
modal.find('.modal-body input[name="is_manager"]').prop( "checked", data.is_manager);
//modal.find('.modal-body input[name="is_manager"]').prop( "checked", data.is_manager);
modal.find('.modal-body select[name="role_id"]').val(data.role_id).trigger('change');
isManager = data.is_manager
if(data.role_id==6) {
@@ -139,8 +137,8 @@ $('#modal-user-labs').on('show.bs.modal', function (event) {
success:function(res){
let data = res.data;
organization_ids = []
if(data.lab_covers.length) {
$.each(data.lab_covers, function (key, value) {
if(data.user_organizations.length) {
$.each(data.user_organizations, function (key, value) {
organization_ids[key] = value.organization_id
});
}

View File

@@ -26,7 +26,7 @@
<div class="col-md-12 grid-margin stretch-card">
<div class="card" style="min-height: 80vh;">
<div class="card-body">
<h4 class="card-title">{{__('laboratory.table_title')}}</h4>
<h4 class="card-title"><i class="mdi mdi-dots-vertical menu-icon"></i> {{__('laboratory.table_title')}}</h4>
<div class="row">
<div class="col-sm-12">
<form method="get" action="{{url('laboratory/search')}}">
@@ -95,7 +95,7 @@
</div>
<!-- Modal Laboratory -->
<div class="modal mt-5 fade modal-primary" id="modal-laboratory">
<div class="modal-dialog modal-xl">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h6 class="modal-title">{{__('_')}}</h6>
@@ -160,7 +160,7 @@
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-inverse-success rounded-25" id="btnSave"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('lang.save')}}</span><span class="update" style="display: none">{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-success rounded-25" id="btnSave"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('lang.save')}}</span><span class="update" style="display: none">{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-secondary rounded-25 ml-2" data-dismiss='modal'>{{__('lang.cancel')}}</button>
</div>
</div>

View File

@@ -120,7 +120,8 @@
</ul>
<button class="navbar-toggler navbar-toggler-right d-lg-none align-self-center" type="button" data-toggle="offcanvas">
<span class="mdi mdi-backburger text-white"></span>
{{-- <span class="mdi mdi-menu-swap-outline text-white" ></span>--}}
<span class="mdi mdi-menu-swap-outline text-white fa fa-rotate-180" style="font-size: 20pt; top: 20px; padding: 3px; rotate:90deg;"></span>
</button>
</div>
</nav>

View File

@@ -48,16 +48,45 @@
</li>
@endif
<li class="nav-item {{ in_array(request()->segment(1), ['laboratory-profile', 'department', 'sample-type', 'test', 'comment', 'organism', 'antibiotic', 'quantity', 'sample-source', 'patient-type', 'physician', 'lab-users']) ? 'active' : '' }}">
<a class="nav-link" data-toggle="collapse" href="#incident-record" aria-expanded="false" aria-controls="incident-record">
<i class="mdi mdi-oil-temperature menu-icon"></i>
<span class="menu-title text-uppercase">កត់ត្រាឧប្បត្តិហេតុ</span>
<i class="menu-arrow"></i>
</a>
<div class="collapse {{ in_array(request()->segment(1), ['laboratory-profile', 'department', 'sample-type', 'test', 'comment', 'organism', 'antibiotic', 'quantity', 'sample-source', 'patient-type', 'physician', 'lab-users']) ? 'show' : '' }}" id="incident-record">
<ul class="nav flex-column sub-menu">
</ul>
</div>
</li>
<li class="nav-item {{ in_array(request()->segment(1), ['laboratory-profile', 'department', 'sample-type', 'test', 'comment', 'organism', 'antibiotic', 'quantity', 'sample-source', 'patient-type', 'physician', 'lab-users']) ? 'active' : '' }}">
<a class="nav-link" data-toggle="collapse" href="#lab-manager" aria-expanded="false" aria-controls="lab_manager">
<i class="fa fa-folder-open-o menu-icon"></i>
<span class="menu-title text-uppercase">គ្រប់គ្រងសម្ភារៈ</span>
<span class="menu-title text-uppercase">គ្រប់គ្រងសម្ភារៈ និងបរិក្ខារ</span>
<i class="menu-arrow"></i>
</a>
<div class="collapse {{ in_array(request()->segment(1), ['laboratory-profile', 'department', 'sample-type', 'test', 'comment', 'organism', 'antibiotic', 'quantity', 'sample-source', 'patient-type', 'physician', 'lab-users']) ? 'show' : '' }}" id="lab-manager">
<ul class="nav flex-column sub-menu">
<li class="nav-item"> <a class="nav-link" href="">អគារ</a></li>
<li class="nav-item"> <a class="nav-link" href="">បន្ទប់</a></li>
<li class="nav-item"> <a class="nav-link" href="">ទូរបង្កក</a></li>
<li class="nav-item"> <a class="nav-link" href="">ធ្នើ</a></li>
<li class="nav-item"> <a class="nav-link" href="">ប្រអប់សំណាក</a></li>
</ul>
</div>
</li>
<li class="nav-item {{ in_array(request()->segment(1), ['laboratory-profile', 'department', 'sample-type', 'test', 'comment', 'organism', 'antibiotic', 'quantity', 'sample-source', 'patient-type', 'physician', 'lab-users']) ? 'active' : '' }}">
<a class="nav-link" data-toggle="collapse" href="#catalog" aria-expanded="false" aria-controls="catalog">
<i class="mdi mdi-cards-variant menu-icon"></i>
<span class="menu-title text-uppercase">គ្រប់គ្រងបញ្ជីគម្រូ</span>
<i class="menu-arrow"></i>
</a>
<div class="collapse {{ in_array(request()->segment(1), ['laboratory-profile', 'department', 'sample-type', 'test', 'comment', 'organism', 'antibiotic', 'quantity', 'sample-source', 'patient-type', 'physician', 'lab-users']) ? 'show' : '' }}" id="catalog">
<ul class="nav flex-column sub-menu">
<li class="nav-item"> <a class="nav-link" href="">បញ្ជីគម្រូ</a></li>
<li class="nav-item"> <a class="nav-link" href="">ប្រភេទសារពាង្គកាយ/មេរោគ</a></li>
<li class="nav-item"> <a class="nav-link" href="">ប្រភេទសំណាក</a></li>
<li class="nav-item"> <a class="nav-link" href="">ប្រភពសំណាក</a></li>

View File

@@ -75,8 +75,8 @@
? asset('storage/avatars/'.auth()->user()->avatar)
: 'https://ui-avatars.com/api/?name='.urlencode(auth()->user()->name) }}"
class="rounded-circle"
width="100"
height="100">
width="80"
height="80">
</div>
<!-- Name -->
<h6 class="mb-1">{{ auth()->user()->name }}</h6>
@@ -84,11 +84,11 @@
<div class="text-start">
<p>
{{__('general.user_name')}} :
<strong>{{ auth()->user()->email }}</strong>
{{ auth()->user()->email }}
</p>
<p>
{{__('general.user_role')}} :
<strong>{{ auth()->user()->role->name_en }}</strong>
{{ auth()->user()->role->name_en }}
</p>
</div>

View File

@@ -131,7 +131,7 @@
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-info rounded-25" id="btnSave"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('general.btn_save')}}</span><span class="update" style="display: none">{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-success rounded-25" id="btnSave"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('general.btn_save')}}</span><span class="update" style="display: none">{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-secondary rounded-25 mx-3" data-dismiss='modal'>{{__('general.btn_cancel')}}</button>
</div>
</div>
@@ -158,7 +158,7 @@
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-info rounded-25" onclick="$('#submit_role_permission').click()"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('lang.save')}}</span><span class="update" style="display: none">{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-success rounded-25" onclick="$('#submit_role_permission').click()"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('lang.save')}}</span><span class="update" style="display: none">{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-secondary rounded-25 mx-3" data-dismiss='modal'>{{__('lang.cancel')}}</button>
</div>
</div>

View File

@@ -90,12 +90,12 @@
<td class="py-1">{{$user->role->name_en}}</td>
<td class="py-1">
@if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['assign_lab']))
<i class="mdi mdi-domain text-info" style="font-size: 17px; cursor: pointer;" title="{{__('user_account.table_labs')}}" aria-hidden="true" data-action="assign_lab" data-uid="{{$user->id}}" data-toggle="modal" data-target="#modal-user-labs" data-backdrop="static"></i> &nbsp;
<i class="mdi mdi-hospital-building text-info" style="font-size: 17px; cursor: pointer;" title="{{__('user_account.table_labs')}}" aria-hidden="true" data-action="assign_lab" data-uid="{{$user->id}}" data-toggle="modal" data-target="#modal-user-labs" data-backdrop="static"></i> &nbsp;
@endif
@foreach($user->userOrganizations as $userOrganization)
<label class="badge badge-outline-info rounded-25" title="{{$userOrganization->organization->name}}">{{ substr($userOrganization->organization->name,0, strpos($userOrganization->organization->name,' ')).'..'}}</label>
<label class="badge badge-outline-info rounded-25" title="{{$userOrganization->organization->name}}">{{ $userOrganization->organization->name}}</label>
@endforeach
</td>
{{-- <td class="py-1 text-center">--}}
@@ -163,7 +163,7 @@
</div>
<div class="modal-footer">
@if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['create_user_account']))
<button type="button" class="btn btn-info rounded-25" id="btnSave"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('general.btn_save')}}</span><span class="update" style="display: none"><i class="fa fa-floppy-o"></i>{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-success rounded-25" id="btnSave"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('general.btn_save')}}</span><span class="update" style="display: none"><i class="fa fa-floppy-o"></i>{{__('lang.update')}}</span></button>
@endif
<button type="button" class="btn btn-secondary rounded-25 mx-3" data-dismiss='modal'>{{__('general.btn_cancel')}}</button>
</div>
@@ -191,13 +191,7 @@
<input type="email" disabled readonly class="form-control" name="email" id="email" />
</div>
<div class="form-group mb-1">
<label for="lab-code" class="control-label">{{__('department.form_laboratory')}}&nbsp;<span class="text-danger">*</span></label>
<div class="form-check" style="width: 250px !important;">
<label class="form-check-label">
<input type="checkbox" class="form-check-input" id="select-all-lab">
{{__('department.form_select_all_lab')}}
</label>
</div>
<label for="lab-code" class="control-label">{{__('laboratory.form_lab_cover')}}&nbsp;<span class="text-danger">*</span></label>
<select class="form-control select2-multiple" multiple="multiple" name="organization_ids" id="organization_ids" style="width: 100% !important;">
@foreach($organizations as $organization)
<option value="{{$organization->id}}">{{$organization->name_en}}</option>
@@ -208,7 +202,7 @@
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-info rounded-25" id="btnAssignLab"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('lang.save')}}</span><span class="update" style="display: none">{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-success rounded-25" id="btnAssignLab"><i class="fa fa-floppy-o"></i>&nbsp;&nbsp;<span class="save">{{__('lang.save')}}</span><span class="update" style="display: none">{{__('lang.update')}}</span></button>
<button type="button" class="btn btn-secondary rounded-25 mx-3" data-dismiss='modal'>{{__('lang.cancel')}}</button>
</div>
</div>
@@ -232,11 +226,11 @@
<div class="input-group mb-3">
<input type="password" required class="form-control rounded-right-0" name="password" id="reset-new-password" placeholder="{{__('user_account.form_new_password')}}">
<div class="input-group-append">
<button class="btn btn-secondary px-3" onmouseout="$('#reset-new-password').attr('type','password')" onclick="$('#reset-new-password').attr('type','text')" type="button" style="font-size: 12px; padding: 5px" ><i class="mdi mdi-looks"></i></button>
<button class="btn btn-light px-3" onmouseout="$('#reset-new-password').attr('type','password')" onclick="$('#reset-new-password').attr('type','text')" type="button" style="font-size: 12px; padding: 5px" ><i class="mdi mdi-lightbulb-on-outline"></i></button>
</div>
</div>
<div class="text-right pt-2">
<button type="button" class="btn btn-info rounded-25 px-3" id="btn-reset-password"><i class="fa fa-floppy-o mr-2"></i>{{__('lang.save')}}</button>
<button type="button" class="btn btn-success rounded-25 px-3" id="btn-reset-password"><i class="fa fa-floppy-o mr-2"></i>{{__('lang.save')}}</button>
<button type="button" data-dismiss="modal" aria-label="Close" class="btn btn-secondary px-3 rounded-25 ml-2">{{__('lang.cancel')}}</button>
</div>
</div>
@@ -244,11 +238,6 @@
</div>
</div>
<div class="modal-footer d-none">
<form id="signature-remove-form" action="" method="POST">
@csrf
</form>
</div>
</div>
</div>
</div>
@@ -268,32 +257,19 @@
var get_url = "{{url('user.get')}}";
var assignLabUrl = "{{url('user.assign-labs')}}";
var isManager = 0;
var reset_password_url = "{{url('user.reset_password')}}";
let modal_add_title = "{{__('user_account.form_add_tittle')}}";
let modal_edit_title = "{{__('user_account.form_edit_tittle')}}";
let base_organization_id = "{{Session::get('base_organization_id')}}";
$('#role-id').change(function () {
if($(this).val()==6 || $(this).val()==7){
$('#physician-id').show()
} else $('#physician-id').hide()
})
$('#select-all-lab').click(function () {
if( $('#select-all-lab').is(':checked')){
$('#organization_ids > option').prop("selected", true)
$('#organization_ids').trigger('change')
}else{
$('#organization_ids > option').prop("selected", false)
$('#organization_ids').trigger('change')
}
})
</script>
<script src="{{url(env("APP_URL").'storage/assets/js/admin/user.js')}}"></script>
</body>