Files
wticreatorstudio/Modules/JobPortal/Admin/UserController.php
T
2024-02-12 22:54:20 -05:00

394 lines
15 KiB
PHP

<?php
namespace Modules\JobPortal\Admin;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Modules\JobPortal\Http\Controllers\JobPortalAdminController;
use Modules\JobPortal\Entities\Candidate;
use Modules\JobPortal\Entities\CandidateCategories;
use Modules\JobPortal\Entities\CandidateCvs;
use Modules\JobPortal\Entities\CandidateSkills;
use Modules\JobPortal\Entities\Category;
use Modules\JobPortal\Entities\Location;
use Modules\JobPortal\Entities\Skill;
use Modules\JobPortal\Entities\Badge;
use Modules\JobPortal\Events\VendorApproved;
use Modules\JobPortal\Exports\UserExport;
use Modules\JobPortal\Entities\CompanyRequest;
class UserController extends JobPortalAdminController
{
public function __construct()
{
if(!is_admin()){
$this->middleware('verified');
}
parent::__construct();
}
public function index(Request $request)
{
$this->checkPermission('user_manage');
$username = $request->query('s');
$listUser = User::query()->orderBy('id','desc');
if (!empty($username)) {
$listUser->where(function($query) use($username){
$query->where('first_name', 'LIKE', '%' . $username . '%');
$query->orWhere('id', $username);
$query->orWhere('phone', $username);
$query->orWhere('email', 'LIKE', '%' . $username . '%');
$query->orWhere('last_name', 'LIKE', '%' . $username . '%');
});
}
if($request->query('role')){
$listUser->role($request->query('role'));
}
$data = [
'rows' => $listUser->paginate(20),
'roles' => Role::all()
];
return view('jobportal::admin.user.index', $data);
}
public function create(Request $request)
{
$row = new \Modules\User\Models\User();
$data = [
'row' => $row,
'rolexs' => Role::all(),
'candidate_create' => $request->get('candidate_create', 0),
'candidate' => new Candidate(),
'locations' => Location::query()->where('status', 'publish')->get()->toTree(),
'categories' => Category::get()->toTree(),
'skills' => Skill::query()->where('status', 'publish')->get(),
'badges' => Badge::query()->where('status', 'publish')->get(),
'breadcrumbs'=>[
[
'name'=>__("Users"),
'url'=>'admin/jobportal/user'
]
]
];
return view('jobportal::admin.user.detail', $data);
}
public function edit(Request $request, $id)
{
$row = User::find($id);
if (empty($row)) {
return redirect('admin/jobportal/user');
}
if ($row->id != Auth::user()->id and !permissionCheck('setting_manage')) {
abort(403);
}
$data = [
'row' => $row,
'locations' => Location::query()->where('status', 'publish')->get()->toTree(),
'categories' => Category::get()->toTree(),
'cvs' => CandidateCvs::query()->where('origin_id', $id)->with('media')->get(),
'skills' => Skill::query()->where('status', 'publish')->get(),
'badges' => Badge::query()->where('status', 'publish')->get(),
];
return view('jobportal::admin.user.detail', $data);
}
public function password(Request $request,$id){
$row = User::find($id);
$data = [
'row'=>$row,
'currentUser'=>Auth::user()
];
if (empty($row)) {
return redirect('admin/jobportal/user');
}
if ($row->id != Auth::user()->id and !permissionCheck('setting_manage')) {
abort(403);
}
return view('jobportal::admin.user.password',$data);
}
public function changepass(Request $request, $id)
{
if(is_demo_mode()){
return redirect()->back()->with("error", __("DEMO MODE: You can not change password!"));
}
$rules = [];
$urow = User::find($id);
if ($urow->id != Auth::user()->id and !permissionCheck('setting_manage')) {
abort(403);
}
$request->validate([
'password' => 'required|min:6|max:255',
'password_confirmation' => 'required',
]);
$password_confirmation = $request->input('password_confirmation');
$password = $request->input('password');
if ($password != $password_confirmation) {
return redirect()->back()->with("error", __("Your New password does not matches. Please type again!"));
}
if ($urow->id != Auth::user()->id and !permissionCheck('setting_manage')) {
if ($password) {
if ($urow->id != Auth::user()->id) {
$rules['old_password'] = 'required';
}
$rules['password'] = 'required|string|min:6|confirmed';
}
$this->validate($request, $rules);
if ($password) {
if (!(Hash::check($request->input('old_password'), $urow->password))) {
// The Old passwords matches
return redirect()->back()->with("error", __("Your current password does not matches with the password you provided. Please try again."));
}
}
}
$urow->password = bcrypt($password);
if ($urow->save()) {
if ($request->input('role_id') and $role = Role::findById($request->input('role_id'))) {
$urow->assignRole($role);
}
return redirect()->back()->with('success', __('Password updated!'));
}
}
public function store(Request $request, $id)
{
if(!is_candidate() && !is_admin() && !is_employer()){
abort(403);
}
if($id and $id>0){
$row = User::find($id);
if(empty($row)){
abort(404);
}
if ($row->id != Auth::user()->id and !permissionCheck('setting_manage')) {
abort(403);
}
$request->validate([
'first_name' => 'required|max:255',
'last_name' => 'required|max:255',
'status' => 'required|max:50',
'phone' => 'required',
'role_id' => 'sometimes|required|max:11',
'email' =>[
'required',
'email',
'max:255',
Rule::unique('users')->ignore($row->id)
],
]);
}else{
$check = Validator::make($request->input(),[
'first_name' => 'required|max:255',
'last_name' => 'required|max:255',
'status' => 'required|max:50',
'phone' => 'required',
'role_id' => 'sometimes|required|max:11',
'email' =>[
'required',
'email',
'max:255',
Rule::unique('users')
],
]);
if(!$check->validated()){
return back()->withInput($request->input());
}
$row = new User();
$row->email = $request->input('email');
}
//$row->name = $request->input('name');
$row->first_name = $request->input('first_name');
$row->last_name = $request->input('last_name');
$row->phone = $request->input('phone');
$row->date_of_birth = date("Y-m-d", strtotime($request->input('birthday')));
$row->bio = clean($request->input('bio'));
$row->status = $request->input('status');
$row->avatar_id = $request->input('avatar_id');
$row->email = $request->input('email');
// $row->need_update_pw = $request->input('need_update_pw');
if(permissionCheck('setting_manage') && $role_id = $request->input('role_id')) {
$row->role_id = $role_id;
}
if ($row->save()) {
if($row->role->permissions->contains('route','job.apply-job') || $row->role->permissions->contains('route','candidate_portal')){
$check = Validator::make($request->input(),[
'title' => 'required|max:255'
]);
if(!$check->validated()){
return back()->withInput($request->input());
}
$cData = Candidate::find($row->id);
if(empty($cData)){
DB::table('jp_candidates')->insert([
'id' => $row->id
]);
$cData = Candidate::find($row->id);
}
$cData->fillByAttr([
'title',
'gallery',
'video',
'gender',
'expected_salary',
'salary_type',
'website',
'education_level',
'experience_year',
'languages',
'allow_search',
'address',
'city',
'country',
'location_id',
'map_lat',
'map_lng',
'map_zoom',
'education',
'experience',
'award',
'social_media',
'video_cover_id',
'badge_id'
], $request->input());
// $cData->save();
if(!empty($request->input('languages')))
{
$cData->languages = implode(',',$request->input('languages'));
}else{
$cData->languages = '';
}
$cData->saveOriginOrTranslation($request->query('lang'),true);
$uploadedCandidate = CandidateCvs::query()->where('origin_id', $row->id)->pluck('file_id')->toArray();
$cvUpload = $request->input('cvs', []);
if(!empty($cvUpload)) {
CandidateCvs::query()->where('origin_id', $row->id)->whereNotIn('file_id', $cvUpload)->delete();
foreach ($cvUpload as $oneCv) {
if (in_array($oneCv, $uploadedCandidate)) {
continue;
}
$cv = new CandidateCvs();
$cv->file_id = $oneCv;
$cv->origin_id = $row->id;
$cv->is_default = 0;
$cv->create_user = Auth::id();
$cv->save();
}
//Update Default CV
CandidateCvs::query()->where("origin_id", $row->id)->update(['is_default' => 0]);
CandidateCvs::query()->where("origin_id", $row->id)->where('file_id', @$request->csv_default)->update(['is_default' => 1]);
}
if(!empty($request->skills)){
$cSkills = CandidateSkills::query()->where('origin_id', $row->id)->pluck('skill_id')->toArray();
foreach($request->skills as $skill){
$pos = array_search(intval($skill), $cSkills);
if($pos !== false){
unset($cSkills[$pos]);
}else{
DB::table('jp_candidate_skills')->insert([
'origin_id' => $row->id,
'skill_id' => $skill
]);
}
}
if(!empty($cSkills)){
CandidateSkills::query()->where('origin_id', $row->id)->whereIn('skill_id', $cSkills)->delete();
}
}else{
CandidateSkills::query()->where('origin_id', $row->id)->delete();
}
if(!empty($request->categories)){
$cCats = CandidateCategories::query()->where('origin_id', $row->id)->pluck('cat_id')->toArray();
foreach($request->categories as $category){
$pos = array_search(intval($category), $cCats);
if($pos !== false){
unset($cCats[$pos]);
}else{
DB::table('jp_candidate_categories')->insert([
'origin_id' => $row->id,
'cat_id' => $category
]);
}
}
if(!empty($cCats)){
CandidateCategories::query()->where('origin_id', $row->id)->whereIn('cat_id', $cCats)->delete();
}
}else{
CandidateCategories::query()->where('origin_id', $row->id)->delete();
}
}
if($id > 0 ){
return back()->with('success', __('User updated') );
}else{
return redirect(route('user.admin.detail', $row->id))->with('success', __('User created') );
}
}
}
public function getForSelect2(Request $request)
{
$q = $request->query('q');
$query = User::select('*')->where('role_id',101);
if ($q) {
$query->where(function ($query) use ($q) {
$query->where('first_name', 'like', '%' . $q . '%')->orWhere('last_name', 'like', '%' . $q . '%')->orWhere('email', 'like', '%' . $q . '%')->orWhere('id', $q)->orWhere('phone', 'like', '%' . $q . '%');
});
}
$res = $query->orderBy('id', 'desc')->orderBy('first_name', 'asc')->limit(20)->get();
$data = [];
if (!empty($res)) {
if($request->query("user_type") == "candidate"){
//for only vendor
foreach ($res as $item) {
if($item->hasPermission("gig_manage")){
$data[] = [
'id' => $item->id,
'text' => $item->getDisplayName() ? $item->getDisplayName() . ' (#' . $item->id . ')' : $item->email . ' (#' . $item->id . ')',
];
}
}
}else{
//for all
foreach ($res as $item) {
$data[] = [
'id' => $item->id,
'text' => $item->getDisplayName() ? $item->getDisplayName() . ' (#' . $item->id . ')' : $item->email . ' (#' . $item->id . ')',
];
}
}
}
return response()->json([
'results' => $data
]);
}
}