Server : Apache System : Linux 145.162.205.92.host.secureserver.net 5.14.0-611.45.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Apr 1 05:56:53 EDT 2026 x86_64 User : tradze ( 1001) PHP Version : 8.1.34 Disable Function : NONE Directory : /home/tradze/www/app/Modules/Users/Http/Controllers/Admin/ |
<?php
namespace App\Modules\Users\Http\Controllers\Admin;
use App\Http\Controllers\AdminController;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Modules\Postcodes\Models\District;
use App\Modules\Postcodes\Models\Zone;
use App\Modules\Schedules\Models\Schedule;
use App\Modules\Services\Models\ServiceDuration;
use App\Modules\Services\Models\ServiceType;
use App\Modules\Users\Http\Requests\TherapistUpdAreasRequest;
use App\Modules\Users\Http\Requests\TherapistUpdAvatarRequest;
use App\Modules\Users\Http\Requests\TherapistUpdPassRequest;
use App\Modules\Users\Models\UserProfile;
use App\Modules\Users\Http\Requests\TherapistCreateRequest;
use App\Modules\Users\Http\Requests\TherapistUpdInfoRequest;
use App\Modules\Users\Models\UserServiceDuration;
use App\Modules\Users\Models\UserWorkingDay;
use App\Modules\Users\Models\TherapistMyWork;
use App\User;
use Spatie\Permission\Models\Role;
use Carbon\Carbon;
use Cmgmyr\Messenger\Models\Thread;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Laracasts\Flash\Flash;
use Yajra\Datatables\Datatables;
use Illuminate\Support\Facades\Auth;
class SalonTherapistController extends AdminController
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index($id)
{
$this->data['salon_id'] = $id;
$this->data['page_title'] = trans('users::salon.page_title');
// dd($this->data);
return view('users::admin.salon_therapists_index', $this->data);
}
/**
* Show a list of all companies
*
* @return mixed
*/
public function data(Request $request,$id)
{
// dd($id);
//create object contact
$obj = $this->getData($request,$id);
// dd($obj);
//create array with contacts permissions access
$this->data['can'] = [
'view' => $this->data['user']->can('admin.users.therapists.show') || $this->data['user']->is('developer') || $this->data['user']->is('salon'),
'edit' => $this->data['user']->can('admin.users.therapists.edit') || $this->data['user']->is('developer') || $this->data['user']->is('salon'),
'delete' => $this->data['user']->can('admin.users.therapists.delete') || $this->data['user']->is('developer') || $this->data['user']->is('salon'),
];
//return datatables data
return Datatables::of($obj)
->editColumn('name', function ($o) {
$data['o'] = $o;
return view('users::admin.partial_name_with_pic', $data)->render();
})
->addColumn('actions', function ($o) {
$this->data['o'] = $o;
return view('users::admin.salon_therapists_list_actions', $this->data)->render();
})
->editColumn('id', function ($o) {
$data['o'] = $o;
return view('users::admin.partial_drag_and_drop_arr', $data)->render();
})
->removeColumn('updated_at')
->setTotalRecords($obj->count())
->make(true);
}
/**
* Get object entries
* @param Request $request
*/
protected function getData(Request $request,$id)
{
if(isset($id)){
$group = Role::where('name', 'therapist')->first();
$obj = User::query()->where('salon_id',$id)->whereHas('roles', function ($query) {
return $query->where('slug', 'therapist');
})->orderBy('nr_crt', 'asc');
}
//return object
return $obj;
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create($id)
{
$zone = new Zone();
$this->data['id'] = $id;
$this->data['page_title'] = trans('users::salon.page_title');
$this->data['form']['services'] = ServiceType::lists('name', 'id')->put(0, trans('general.form_select_option'));
$this->data['form']['zones'] = $zone->formList();
$this->data['form']['districts'] = District::orderBy('name', 'asc')->lists('name', 'id');
$this->data['form']['workingdays'] = Schedule::all();
$this->data['form']['transport_modes'] = trans("users::therapists.transport_modes_opt");
$this->data['form']['massage_table_status'] = false;
// dd($this->data['form']['services']);
//show page
return view('users::admin.therapists_create', $this->data);
}
/**
* Store a newly created resource in storage.
*
* @return Response TherapistCreateRequest
*/
public function store(Request $request, $id)
{
// dd($id);
//start transaction
DB::beginTransaction();
$data = [
'name' => $request->first_name . ' ' . $request->last_name,
'email' => $request->email,
'password' => $request->password,
];
if(isset($id)){
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'api_token' => str_random(60),
'salon_id' => $id
]);
} else {
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'api_token' => str_random(60),
]);
}
//assign to a ditrict if is not provided
if ((int)$request->district_id > 0) {
$district_id = $request->district_id;
} else {
$district = District::first();
$district_id = $district->id;
}
//create user profile
$profile = UserProfile::create([
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'mobile_number' => $request->mobile_number,
'about' => $request->about,
'user_id' => $user->id,
'district_id' => $district_id,
'transport_mode' => 0,
'massage_table_status' => $request->massage_table_status,
]);
//save services types to user (user techniques)
$user->servicetypes()->sync((array) $request->service_id);
//save coverage areas
$user->zones()->sync($request->zone_id);
//save therapist working days schedule
foreach ($request->dayname as $key => $dayname) {
$day_data = [
'user_id' => $user->id,
'name' => $dayname,
'weekday' => $key,
'dayoff' => (int)@$request->dayoff[$key],
'bo_start' => Carbon::createFromFormat('h:i A', $request->bo_start[$key])->format('H:i'),
'bo_end' => Carbon::createFromFormat('h:i A', $request->bo_end[$key])->format('H:i'),
];
UserWorkingDay::create($day_data);
} //endforeach
//get therapist role
$role = Role::where('slug', 'therapist')->first();
//attach role
if ($role)
$role_status = $user->assignRole($role);
if ($user && $profile) {
//commit transaction
DB::commit();
// dd($request->save);
//redirect
// dd($request->save);
return redirect(route('admin.users.salon.therapists', ['id' => $id]));
// if ($request->save)
// return redirect(route('admin.users.therapists.show', ['id' => $obj->id]));
// elseif ($request->save_exit)
// return redirect(route('admin.users.salon.therapists'));
} else {
//rollback
DB::rollback();
return redirect(route('admin.users.therapists.create'))->withInput();
} //end elseif
}
protected function get_my_work($obj)
{
$results = [];
$list = TherapistMyWork::where('user_id',$obj->id)
->orderBy('order','asc')
->orderBy('id','asc')
->get();
foreach($list as $li){
$results[$li->id]=[
'id' => $li->id,
'title' => $li->title,
'order' => $li->order,
'url' => $li->url,
'path' => $li->path,
'image' => $li->image,
];
} //endforeach
// dd($results);
//return results
return $results;
}
/**
* Edit Service Type
*
* @param $label
* @return \BladeView|bool|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function edit($obj)
{
$obj->with('profile');
$obj->first_name = $obj->profile->first_name;
$obj->last_name = $obj->profile->last_name;
$obj->mobile_number = $obj->profile->mobile_number;
$obj->about = $obj->profile->about;
$obj->role = $obj->getRoles()->first()->name;
$obj->zone_id = $obj->zones;
$saved_services = [];
foreach ($obj->servicetypes as $serv)
$saved_services[] = $serv->id;
$saved_zones = [];
foreach ($obj->zones as $zone)
$saved_zones[] = $zone->id;
$zone = new Zone();
$default_wd = Schedule::all();
foreach ($default_wd as $day) {
$day->dayoff = !$day->open;
}
$obj->services_commisions;
$this->data['page_title'] = trans('users::therapists.page_title');
$this->data['obj'] = $obj;
$this->data['form']['services'] = ServiceType::lists('name', 'id')->put(0, trans('general.form_select_option'));
$this->data['form']['saved_services'] = $saved_services;
$this->data['form']['services_duration_commisions'] = $obj->services_commisions;
$this->data['form']['zones'] = $zone->formList();
$this->data['form']['saved_zones'] = $saved_zones;
$this->data['form']['districts'] = District::orderBy('name', 'asc')->lists('name', 'id');
$this->data['form']['workingdays'] = ($obj->workingdays->count()) ? $obj->workingdays : collect($default_wd);
$this->data['form']['transport_modes'] = trans("users::therapists.transport_modes_opt");
$this->data['form']['massage_table_status'] = $obj->has_massage_table;
//show page
return view('users::admin.therapists_edit', $this->data);
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
*/
public function update(TherapistUpdInfoRequest $request, $obj)
{
// echo "<pre>";
// print_r($request->input()); die();
$user_data = [
'name' => $request->first_name . ' ' . $request->last_name,
'email' => $request->email,
];
User::where('id', $obj->id)->update($user_data);
$profile_data = [
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'mobile_number' => $request->mobile_number,
'about' => $request->about,
'transport_mode' => $request->transport_mode,
'massage_table_status' => $request->massage_table_status,
];
$profile = $obj->profile;
$profile->update($profile_data);
//sync services types
$selected_services = (array)$request->service_id;
foreach ($selected_services as $key => $srv) {
if (!$srv)
unset($selected_services[$key]);
}
$obj->servicetypes()->sync((array) $selected_services);
$user_id = $obj->id;
$deleteworkingdays = DB::table("user_schedule")->where("user_id", $user_id)->delete();
$workingdays = $obj->workingdays;
//save therapist working days schedule
//add working days to user
foreach ($request->dayname as $key => $dayname) {
$bo_start_len = count($request->bo_start[$key]);
if($bo_start_len){
for($i=0; $i<$bo_start_len; $i++){
$day_data = [
'user_id' => $obj->id,
'name' => $dayname,
'weekday' => $key,
'dayoff' => (int)@$request->dayoff[$key],
'bo_start' => Carbon::createFromFormat('h:i A', $request->bo_start[$key][$i])->format('H:i'),
'bo_end' => Carbon::createFromFormat('h:i A', $request->bo_end[$key][$i])->format('H:i'),
];
//print_r($day_data);
UserWorkingDay::create($day_data);
}
}
} //endforeach
//die();
//update working days
// if (!$obj->workingdays->count()) {
// //add working days to user
// foreach ($request->dayname as $key => $dayname) {
// $day_data = [
// 'user_id' => $obj->id,
// 'name' => $dayname,
// 'weekday' => $key,
// 'dayoff' => (int)@$request->dayoff[$key],
// 'bo_start' => Carbon::createFromFormat('h:i A', $request->bo_start[$key])->format('H:i'),
// 'bo_end' => Carbon::createFromFormat('h:i A', $request->bo_end[$key])->format('H:i'),
// ];
// UserWorkingDay::create($day_data);
// } //endforeach
// } else {
// //update working days
// foreach ($obj->workingdays as $day) {
// $day_data = [
// 'dayoff' => (int)@$request->dayoff[$day->weekday],
// 'bo_start' => Carbon::createFromFormat('h:i A', $request->bo_start[$day->weekday])->format('H:i'),
// 'bo_end' => Carbon::createFromFormat('h:i A', $request->bo_end[$day->weekday])->format('H:i'),
// ];
// $day->update($day_data);
// } //endforeach
// }
//redirect
if ($request->save) {
return redirect(route('admin.users.therapists.edit', ['id' => $obj->id]));
} elseif ($request->save_exit) {
return redirect(route('admin.users.therapists.index'));
}
}
/**
* Update user password
* @param TherapistUpdPassRequest $request
* @param $obj
*/
public function update_pass(TherapistUpdPassRequest $request, $obj)
{
$data = [
'password' => bcrypt($request->password),
];
$obj->update($data);
//redirect
if ($request->save) {
return redirect(route('admin.users.therapists.edit', ['id' => $obj->id]));
} elseif ($request->save_exit) {
return redirect(route('admin.users.therapists.index'));
}
}
/**
* Update user password
* @param TherapistUpdPassRequest $request
* @param $obj
*/
public function update_areas(TherapistUpdAreasRequest $request, $obj)
{
//save therapist district
$profile = $obj->profile;
$profile->district_id = $request->district_id;
$profile->save();
//save new coverage areas
$obj->zones()->sync($request->zone_id);
//redirect
if ($request->save) {
return redirect(route('admin.users.therapists.edit', ['id' => $obj->id]) . "#tab_1_4");
} elseif ($request->save_exit) {
return redirect(route('admin.users.therapists.index'));
}
}
/**
* Update user password
* @param TherapistUpdPassRequest $request
* @param $obj
*/
public function update_avatar(TherapistUpdAvatarRequest $request, $obj)
{
$file = $request->file('avatar');
$filename = str_slug(str_replace($file->getClientOriginalExtension(), '', $file->getClientOriginalName()));
$extension = $file->getClientOriginalExtension();
$path_file = 'avatar/' . $filename . "." . $extension;
//upload file
$upload = Storage::disk('public_images')->put(
$path_file,
file_get_contents($request->file('avatar')->getRealPath())
);
$profile = $obj->profile;
$profile->avatar = $path_file;
$profile->save();
//redirect
if ($request->save) {
return redirect(route('admin.users.therapists.edit', ['id' => $obj->id]));
} elseif ($request->save_exit) {
return redirect(route('admin.users.therapists.index'));
}
}
public function update_commisions(Request $request, $obj)
{
$errors = [];
$rules = [];
foreach ($request->services_duration_commisions as $k => $services_duration_commision) {
$checkTotal = (float)$services_duration_commision['commision_co'] + (float)$services_duration_commision['commision_th'];
$rules['price_' . $k] = 'required|numeric|min:0|size:' . $checkTotal;
$prices['price_' . $k] = $services_duration_commision['price_' . $k];
}
$statusAll = Validator::make($prices, $rules);
foreach ($request->services_duration_commisions as $k => $services_duration_commision) {
$checkTotal = (float)$services_duration_commision['commision_co'] + (float)$services_duration_commision['commision_th'];
$status = Validator::make($services_duration_commision, [
'price_' . $k => 'required|numeric|min:0|size:' . $checkTotal,
]);
if (!$status->fails()) {
$dataServiceCommision['services_duration_id'] = $k;
$dataServiceCommision['user_id'] = $obj->id;
$therapistServiceCommision = UserServiceDuration::firstOrCreate($dataServiceCommision);
$therapistServiceCommision->commision_co = $services_duration_commision['commision_co'];
$therapistServiceCommision->commision_th = $services_duration_commision['commision_th'];
$therapistServiceCommision->price = $checkTotal;
$therapistServiceCommision->save();
}
}
if ($statusAll->fails()) {
return redirect(route('admin.users.therapists.edit', ['id' => $obj->id]) . "#tab_1_5")->withErrors($statusAll)->withInput();
}
//redirect
if ($request->save) {
return redirect(route('admin.users.therapists.edit', ['id' => $obj->id]) . "#tab_1_5");
} elseif ($request->save_exit) {
return redirect(route('admin.users.therapists.index'));
}
}
/**
* Delete page
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function delete($obj)
{
$this->data['obj'] = $obj;
return view('users::admin.therapists_delete', $this->data);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($obj)
{
//set object name
$obj_name = $obj->name;
UserServiceDuration::where('user_id', $obj->id)->delete();
//delete contact
$obj->delete();
//set success message
Flash::info(trans('users::therapists.message_confirm_delete', ['name' => $obj->name]));
//redirect to contacts list
return redirect(route('admin.users.therapists.index'));
}
/**
* Profile Overview
* @param $obj
*/
public function show($obj)
{
$obj->role = $obj->getRoles()->first()->name;
//load messages
$threads = Thread::forUser($obj->id)->latest('updated_at')->get();
$this->data['obj'] = $obj;
$this->data['workingdays'] = $obj->workingdays;
$this->data['services_duration_commisions'] = $obj->services_commisions;
$this->data['daysoff'] = $obj->daysoff;
$this->data['threads'] = $obj->threads;
$this->data['bookings'] = $obj->therapistbookings()
->select('*', DB::raw('CONCAT_WS(" ",date,hour) as bookingdate'))
->whereRaw('CONCAT_WS(" ",date,hour) >= NOW()')
->whereHas('booking', function ($query) {
return $query->where('is_active', 1);
})
->orderBy('bookingdate', 'asc')
->get();
//display page
return view('users::admin.therapists_show', $this->data);
}
/**
* Update massage me now
* @param $obj
*/
public function update_massage_me_now($obj, Request $request)
{
//update user massage me now status
$profile = $obj->profile;
$profile->massage_me_now = $request->massage_me_now;
$profile->save();
//return response with success
return redirect(route('admin.users.therapists.show', ['id' => $obj->id]));
}
public function sort_therapists(Request $request)
{
if (isset($request->therapists)) {
foreach ($request->therapists as $k => $therapist) {
$therapistObj = User::where('id', $therapist)->first();
$therapistObj->nr_crt = $k;
$therapistObj->save();
}
}
return response(['message' => 'success'], 200);
}
public function add_coverage_areas(Request $request)
{
// echo "<pre>";
// print_r($request->polygondata);
// die('in');
if (isset($request->polygondata)) {
$therapist_id = $request->therapist_id;
$last_coverage_areas = DB::table("therapists_coverage_areas")->where('user_id', $therapist_id)->orderBy('id','desc')->first();
$last_polygon_no = !empty($last_coverage_areas->polygon_no)?$last_coverage_areas->polygon_no + 1:1;
$count = $last_polygon_no;
$user_id = $request->therapist_id;
foreach ($request->polygondata as $polygon) {
foreach ($polygon as $value) {
$region = explode(',', $value);
$lat = $region[0];
$lng = $region[1];
$data = array(
'user_id' => $user_id,
'polygon_no' => $count,
'lat' => $lat,
'lng' => $lng
);
//print_r($data);
DB::table("therapists_coverage_areas")->insert($data);
}
$count++;
}
return response(['message' => 'Coverage locations saved successfully'], 200);
} else {
return response(['message' => 'Please select region first '], 200);
}
return response(['message' => 'success'], 200);
}
public function get_therapists_coverage_areas(Request $request)
{
if (isset($request->therapist_id)) {
$therapist_id = $request->therapist_id;
$coverage_areas = DB::table("therapists_coverage_areas")->where('user_id', $therapist_id)->get();
$attrs = [];
foreach ($coverage_areas as $key => $value) {
// -> as it return std object
$attrs[$value->polygon_no][] = $value;
}
return response(['message' => 'Coverage locations', 'data' => $attrs], 200);
} else {
return response(['message' => 'therapist is not found'], 200);
}
}
public function delete_coverage_areas(Request $request)
{
if (isset($request->remove_locations)) {
$therapist_id = $request->therapist_id;
foreach ($request->remove_locations as $polygon) {
$region = explode(',', $polygon);
$lat = $region[0];
$lng = $region[1];
$data = array(
'user_id' => $therapist_id,
'lat' => $lat,
'lng' => $lng
);
//print_r($data);
DB::table("therapists_coverage_areas")->where('user_id',$therapist_id)->where('lat',$lat)->where('lng',$lng)->delete();
}
return response(['message' => 'Coverage locations deleted successfully'], 200);
} else {
return response(['message' => 'Please select region first '], 200);
}
return response(['message' => 'success'], 200);
}
public function delete_all_coverage_areas(Request $request)
{
$therapist_id = $request->therapist_id;
if (!empty($therapist_id)) {
DB::table("therapists_coverage_areas")->where('user_id',$therapist_id)->delete();
return response(['message' => 'All Coverage locations deleted successfully'], 200);
} else {
return response(['message' => 'Therapists ID not found' ], 200);
}
return response(['message' => 'success'], 200);
}
public function add_travel_cost_for_areas(Request $request)
{
if (isset($request->polygondata)) {
$therapist_id = $request->therapist_id;
$region_price = $request->region_price;
$last_coverage_areas = DB::table("therapists_travel_costs")->where('user_id', $therapist_id)->orderBy('id','desc')->first();
$last_polygon_no = !empty($last_coverage_areas->polygon_no)?$last_coverage_areas->polygon_no + 1:1;
$count = $last_polygon_no;
$user_id = $request->therapist_id;
foreach ($request->polygondata as $polygon) {
foreach ($polygon as $value) {
$region = explode(',', $value);
$lat = $region[0];
$lng = $region[1];
$data = array(
'user_id' => $user_id,
'price' => $region_price,
'polygon_no' => $count,
'lat' => $lat,
'lng' => $lng
);
//print_r($data);
DB::table("therapists_travel_costs")->insert($data);
}
$count++;
}
return response(['message' => 'Travel Cost saved for this region,please add for another region'], 200);
} else {
return response(['message' => 'Please select region first '], 200);
}
return response(['message' => 'success'], 200);
}
public function get_therapists_travel_cost_areas(Request $request)
{
if (isset($request->therapist_id)) {
$therapist_id = $request->therapist_id;
$coverage_areas = DB::table("therapists_travel_costs")->where('user_id', $therapist_id)->get();
$attrs = [];
foreach ($coverage_areas as $key => $value) {
// -> as it return std object
$attrs[$value->polygon_no][] = $value;
}
return response(['message' => 'Travel Cost locations', 'data' => $attrs], 200);
} else {
return response(['message' => 'therapist is not found'], 200);
}
}
public function delete_travel_cost_areas(Request $request)
{
if (isset($request->remove_locations)) {
$therapist_id = $request->therapist_id;
foreach ($request->remove_locations as $polygon) {
$region = explode(',', $polygon);
$lat = $region[0];
$lng = $region[1];
$data = array(
'user_id' => $therapist_id,
'lat' => $lat,
'lng' => $lng
);
//print_r($data);
DB::table("therapists_travel_costs")->where('user_id',$therapist_id)->where('lat',$lat)->where('lng',$lng)->delete();
}
return response(['message' => 'Travel Cost locations deleted successfully'], 200);
} else {
return response(['message' => 'Please select region first '], 200);
}
return response(['message' => 'success'], 200);
}
public function delete_all_travel_cost_areas(Request $request)
{
$therapist_id = $request->therapist_id;
if (!empty($therapist_id)) {
DB::table("therapists_travel_costs")->where('user_id',$therapist_id)->delete();
return response(['message' => 'All Travel Cost locations deleted successfully'], 200);
} else {
return response(['message' => 'Therapists ID not found' ], 200);
}
return response(['message' => 'success'], 200);
}
}