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/public_html/dev-test/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\Schedules\Models\Schedule;
use App\Modules\Services\Models\ServiceType;
use App\Modules\Users\Models\SalonGallery;
use App\Modules\Users\Http\Requests\SalonCreateRequest;
use App\Modules\Users\Http\Requests\SalonUpdAvatarRequest;
use App\Modules\Users\Http\Requests\SalonUpdInfoRequest;
use App\Modules\Users\Http\Requests\SalonUpdPassRequest;
use App\Modules\Users\Models\UserAddress;
use App\Modules\Users\Models\UserProfile;
use App\Modules\Users\Models\UserWorkingDay;
use App\User;
use Spatie\Permission\Models\Role;
use Carbon\Carbon;
use Cmgmyr\Messenger\Models\Thread;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Laracasts\Flash\Flash;
use Yajra\Datatables\Datatables;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Mail;
use App\Modules\Postcodes\Models\Zone;
use App\Modules\Postcodes\Models\District;
class SalonController extends AdminController
{
/**
* Show the application admin login form.
*
* @return \Illuminate\Http\Response
*/
public function getLoginAs($id)
{
$login = Auth::loginUsingId($id);
return redirect('/');
}
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index(Request $request)
{
//store filters to sessions
// dd("------");
if ($request->get('search')) {
$request->session()->put('salon.site.filters', $request->except(['_token', 'search']));
return redirect(route('admin.users.salon.index'));
} elseif ($request->get('reset')) {
$request->session()->forget('salon.site.filters');
return redirect(route('admin.users.salon.index'));
}
//end elseif
$this->data['page_title'] = trans('users::salon.page_title');
$this->data['filters'] = $request->session()->get('salon.site.filters');
// dd("here");
return view('users::admin.salon_index', $this->data);
}
/**
* Show a list of all companies
*
* @return mixed
*/
public function data(Request $request)
{
// dd("here 1", $user);
//create object contact
$obj = $this->getData($request);
// dd($obj);
//create array with contacts permissions access
$this->data['can'] = [
'view' => $this->data['user']->roles->pluck('slug')[0] == 'developer',
'edit' => $this->data['user']->roles->pluck('slug')[0] == 'developer',
'therapists' => $this->data['user']->roles->pluck('slug')[0] == 'developer',
'delete' => $this->data['user']->roles->pluck('slug')[0] == 'developer',
'featured' => $this->data['user']->roles->pluck('slug')[0] == 'developer',
];
//return datatables data
return Datatables::of($obj)
->editColumn('name', function ($o) {
$data['o'] = $o;
return view('users::admin.partial_name_with_pic', $data)->render();
})
->editColumn('status', function ($o) {
$data['o'] = $o;
return view('users::admin.partial_subscription_status', $data)->render();
})
->addColumn('actions', function ($o) {
$this->data['o'] = $o;
return view('users::admin.salon_list_actions', $this->data)->render();
})
->rawColumns(['name', 'status', 'actions'])
->removeColumn('id')
->removeColumn('updated_at')
->make(true);
}
/**
* Get object entries
* @param Request $request
*/
protected function getData(Request $request)
{
//get filters
$filters = $request->session()->get('salon.site.filters');
$obj = [];
if (Auth::user()->hasRole('salon')) {
$obj = User::query()
->whereHas('roles', function ($query) {
return $query->where('slug', 'salon');
})
->where('id', Auth::user()->id)
->OfName(isset($filters['search_name']) ? $filters['search_name'] : null)
->OfPhone(isset($filters['search_phone']) ? $filters['search_phone'] : null)
->with(['stripeSubscription' => function ($query) {
$query->orderBy('id', 'desc')->get();
}])->get();
// dd($obj);
//return object
return $obj;
} else {
$obj = User::query()
->whereHas('roles', function ($query) {
return $query->where('slug', 'salon');
})
->OfName(isset($filters['search_name']) ? $filters['search_name'] : null)
->OfPhone(isset($filters['search_phone']) ? $filters['search_phone'] : null)
->with(['stripeSubscription' => function ($query) {
$query->orderBy('id', 'desc')->get();
}])->get();
// dd("here");
//return object
return $obj;
}
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$zone = new Zone();
$this->data['form']['zones'] = $zone->formList();
$this->data['form']['districts'] = District::orderBy('name', 'asc')->pluck('name', 'id');
$this->data['page_title'] = trans('users::salon.page_title');
$this->data['form']['workingdays'] = Schedule::all();
//show page
return view('users::admin.salon_create', $this->data);
}
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store(SalonCreateRequest $request)
{
// dd($request->all());
$addr_longitude = '';
$addr_latitude = '';
// $address = !empty($booking['address'])?$booking['address']:'';
$address = $request->address . ' ' . $request->county . ' ' . $request->postcode;
if (!empty($address)) {
//Formatted address
$formattedAddr = str_replace(' ', '+', $address);
//Send request and receive json data by address
$geocodeFromAddr = file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address=' . $formattedAddr . '&sensor=false&key=' . config("googlemaps.key"));
$output = json_decode($geocodeFromAddr);
//Get latitude and longitute from json data
$addr_latitude = !empty($output->results[0]->geometry->location->lat) ? $output->results[0]->geometry->location->lat : '';
$addr_longitude = !empty($output->results[0]->geometry->location->lng) ? $output->results[0]->geometry->location->lng : '';
}
$first_name = strtok($request->salon_name, ' ');
$last_name = strstr($request->salon_name, ' ');
// dd($addr_latitude, $addr_longitude);
//start transaction
DB::beginTransaction();
$slug = Str::slug($request->salon_name);
$count = User::where('name_slug', 'LIKE', "$slug%")->count();
$data = [
'name' => $request->salon_name,
// 'name' => $request->first_name.' '.$request->last_name,
'email' => $request->email,
'show_email' => $request->show_email,
'instagram_id' => $request->instagram_id,
'facebook_id' => $request->facebook_id,
'tictok_id' => $request->tictok_id,
'youtube_id' => $request->youtube_id,
'password' => $request->password,
'lat' => $addr_latitude,
'long' => $addr_longitude,
'name_slug' => $count ? "{$slug}-{$count}" : $slug,
];
// dd($data);
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'name_slug' => $data['name_slug'],
'password' => bcrypt($data['password']),
'trial_ends_at' => Carbon::now()->addYears(10),
]);
//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' => $first_name,
'last_name' => $last_name,
'mobile_number' => $request->mobile_number,
'show_mobile_number' => $request->show_mobile_number,
'website_url' => $request->website_url,
'district_id' => $district_id,
'trial_ends_at' => Carbon::now()->addYears(10),
'user_id' => $user->id,
]);
//Add Salon Address
$main_address = UserAddress::create([
'user_id' => $user->id,
'address' => $request->address,
'county' => $request->county,
'postcode' => $request->postcode,
'is_main' => 1,
]);
// dd($main_address);
//save coverage areas
$user->zones()->sync($request->zone_id);
//save salon 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 customer role
$role = Role::where('slug', 'salon')->first();
//attach role
if ($role)
$role_status = $user->assignRole($role);
if ($user && $profile && $main_address) {
//commit transaction
DB::commit();
Mail::send('users::frontend_new.emails.newaccount_venue', ['user' => $user, 'data' => $data], function ($m) use ($user) {
$m->from(env('MAIL_FROM'), env('APP_NAME'));
$m->to($user->email, $user->name);
$m->bcc(explode(',', env('MAIL_NEWORDER_BCC')), env('MAIL_NEWORDER_BCC_NAME'));
$m->subject(env('APP_NAME') . ' – New account');
});
//redirect
if ($request->save)
return redirect(route('admin.users.salon.show', ['id' => $obj->id]));
elseif ($request->save_exit)
return redirect(route('admin.users.salon.index'));
} else {
//rollback
DB::rollback();
return redirect(route('admin.users.salon.create'))->withInput();
} //end elseif
}
/**
* Edit Customer/salon account
*
* @param $label
* @return \BladeView|bool|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function edit(Request $request, $obj)
{
$obj_user = User::where('id', $obj)->get();
$obj = $obj_user[0];
$obj->with('profile');
// dd($obj->with('profile'));
$obj->salon_name = $obj->profile->first_name . ' ' . $obj->profile->last_name;
// dd($obj->salon_name);
$obj->first_name = $obj->profile->first_name;
$obj->last_name = $obj->profile->last_name;
$obj->mobile_number = $obj->profile->mobile_number;
$obj->show_mobile_number = $obj->profile->show_mobile_number;
$obj->website_url = $obj->profile->website_url;
$obj->about = $obj->profile->about;
$obj->role = $obj->roles->pluck('name')[0];
$obj->zone_id = $obj->zones;
$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;
}
$this->data['page_title'] = trans('users::salon.page_title');
$this->data['obj'] = $obj;
$this->data['form']['zones'] = $zone->formList();
$this->data['form']['saved_zones'] = $saved_zones;
$this->data['form']['districts'] = District::orderBy('name', 'asc')->pluck('name', 'id');
$this->data['form']['workingdays'] = ($obj->workingdays->count()) ? $obj->workingdays : collect($default_wd);
$this->data['form']['useraddress'] = $this->get_request_address($request);
$this->data['form']['saved_addr'] = $this->get_saved_address($obj);
$this->data['form']['saved_gallery'] = $this->get_saved_gallery($obj);
$this->data['form']['show_email'] = $obj->show_email;
$this->data['form']['show_mobile_number'] = $obj->profile->show_mobile_number;
// dd($this->data);
//show page
return view('users::admin.salon_edit', $this->data);
}
protected function get_saved_gallery($obj)
{
$results = [];
$list = SalonGallery::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;
}
protected function get_request_address($request)
{
$data['address'] = $request->old('address');
$data['county'] = $request->old('county');
$data['postcode'] = $request->old('postcode');
$data['is_main'] = $request->old('is_main');
return $data;
}
/**
* Get contracts documents
* @param $obj
*/
protected function get_saved_address($obj)
{
$results = [];
$address = UserAddress::where('user_id', $obj->id)->get();
foreach ($address as $adr) {
$results[$adr->id] = [
'id' => $adr->id,
'address' => $adr->address,
'postcode' => $adr->postcode,
'county' => $adr->county,
'country' => $adr->country,
'is_main' => $adr->is_main,
];
} //endforeach
//return results
return $results;
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
*/
public function update(SalonUpdInfoRequest $request, $obj)
{
$first_name = strtok($request->salon_name, ' ');
$last_name = strstr($request->salon_name, ' ');
// dd($request->all());
$obj_user = User::where('id', $obj)->with('profile', 'address', 'workingdays')->get();
$obj = $obj_user[0];
// $obj->
$user_data = [
// 'name' => $request->first_name.' '.$request->last_name,
'name' => $request->salon_name,
'email' => $request->email,
'show_email' => $request->show_email,
'instagram_id' => $request->instagram_id,
'facebook_id' => $request->facebook_id,
'tictok_id' => $request->tictok_id,
'youtube_id' => $request->youtube_id,
'website_redirect_url' => $request->website_redirect_url,
];
User::where('id', $obj->id)->update($user_data);
$profile_data = [
'first_name' => $first_name,
'last_name' => $last_name,
'mobile_number' => $request->mobile_number,
'show_mobile_number' => $request->show_mobile_number,
'website_url' => $request->website_url,
'about' => $request->about
];
$profile = $obj->profile;
$profile->update($profile_data);
if ($obj->address) {
foreach ($obj->address as $add) {
if ($add->is_main == 1) {
$addr_longitude = '';
$addr_latitude = '';
// $address = !empty($booking['address'])?$booking['address']:'';
$address = $add->address . ' ' . $add->county . ' ' . $add->postcode;
if (!empty($address)) {
//Formatted address
$formattedAddr = str_replace(' ', '+', $address);
//Send request and receive json data by address
$geocodeFromAddr = file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address=' . $formattedAddr . '&sensor=false&key=' . config("googlemaps.key"));
$output = json_decode($geocodeFromAddr);
//Get latitude and longitute from json data
$addr_latitude = !empty($output->results[0]->geometry->location->lat) ? $output->results[0]->geometry->location->lat : '';
$addr_longitude = !empty($output->results[0]->geometry->location->lng) ? $output->results[0]->geometry->location->lng : '';
}
$user_data = [
'lat' => $addr_latitude,
'long' => $addr_longitude,
];
User::where('id', $obj->id)->update($user_data);
}
}
}
// dd($addr_latitude, $addr_longitude);
//save existing address
foreach ($obj->address as $adr) {
$adrData = [
'address' => $request["address_{$adr->id}"],
'postcode' => $request["postcode_{$adr->id}"],
'county' => $request["county_{$adr->id}"],
'country' => $request["country_{$adr->id}"],
'is_main' => $request["is_main_{$adr->id}"],
];
$adr->update($adrData);
} //end save existing address
//save new address
if ($request->has('address')) {
foreach ($request->address as $key => $val) {
$newaddr = UserAddress::create([
'address' => $val,
'county' => $request['county'][$key],
'postcode' => $request['postcode'][$key],
'is_main' => $request['is_main'][$key],
'user_id' => $obj->id,
]);
} //endforeach
} //endif
$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
//redirect
if ($request->save) {
return redirect(route('admin.users.salon.edit', ['salon' => $obj->id]));
} elseif ($request->save_exit) {
return redirect(route('admin.schedules.bookings.index'));
}
}
/**
* Update user password
* @param TherapistUpdPassRequest $request
* @param $obj
*/
public function update_pass(SalonUpdPassRequest $request, $obj)
{
$obj_user = User::where('id', $obj)->with('profile', 'address', 'workingdays')->get();
$obj = $obj_user[0];
$data = [
'password' => bcrypt($request->password),
];
$obj->update($data);
//redirect
if ($request->save) {
return redirect(route('admin.users.salon.edit', ['id' => $obj->id]));
} elseif ($request->save_exit) {
return redirect(route('admin.schedules.bookings.index'));
}
}
public function makeFeaturedSalon($id)
{
$obj_user = User::where('id', $id)->first();
if ($obj_user->is_featured == 0) {
$data = [
'is_featured' => 1,
];
} else {
$data = [
'is_featured' => 0,
];
}
$obj_user->update($data);
return redirect(route('admin.schedules.bookings.index'));
}
/**
* Update user password
* @param TherapistUpdPassRequest $request
* @param $obj
*/
public function update_avatar(SalonUpdAvatarRequest $request, $obj)
{
$obj_user = User::where('id', $obj)->with('profile', 'address', 'workingdays')->get();
$obj = $obj_user[0];
// dd("here");
$file = $request->file('avatar');
// dd($file);
$filename = strtolower(str_random(20)) . '-' . str_slug(str_replace($file->getClientOriginalExtension(), '', $file->getClientOriginalName()));
$extension = ($file->getClientOriginalExtension()) ?: 'jpg';
$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.salon.edit', ['id' => $obj->id]));
} elseif ($request->save_exit) {
return redirect(route('admin.schedules.bookings.index'));
}
}
/**
* Delete page
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function delete($obj)
{
$obj_user = User::where('id', $obj)->get();
$obj = $obj_user[0];
$this->data['obj'] = $obj;
// dd($this->data['obj']);
return view('users::admin.salon_delete', $this->data);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($obj)
{
$obj_user = User::where('id', $obj)->get();
$obj = $obj_user[0];
//set object name
$obj_name = $obj->name;
//delete contact
$obj->delete();
//set success message
Flash::info(trans('users::salon.message_confirm_delete', ['name' => $obj->name]));
//redirect to contacts list
return redirect(route('admin.users.salon.index'));
}
/**
* Profile Overview
* @param $obj
*/
public function show($obj)
{
$obj_user = User::where('id', $obj)->get();
$obj = $obj_user[0];
// dd($obj);
$obj->role = $obj->roles->pluck('name')[0];
//load messages
$threads = Thread::forUser($obj->id)->latest('updated_at')->get();
$this->data['obj'] = $obj;
$this->data['threads'] = $obj->threads;
$this->data['address'] = $obj->address;
$this->data['bookings'] = $obj->bookings()
->select('*', DB::raw('CONCAT_WS(" ",date,hour) as bookingdate'))
->whereRaw('CONCAT_WS(" ",date,hour) >= NOW()')
->where('is_active', 1)
->orderBy('bookingdate', 'asc')
->get();
//display page
return view('users::admin.salon_show', $this->data);
}
/**
* Add new address
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function add_address()
{
return view('users::admin.salon_partial_new_address');
}
/**
* Delete user address
* @param $id
*/
public function del_address($id)
{
$address = UserAddress::findOrFail($id);
$address->delete();
}
// Salon SEO
public function updateSeo(Request $request, $id)
{
$obj_user = User::where('id', $id)->first();
$seo_data = [
'meta_title' => $request->meta_title,
'meta_description' => $request->meta_description,
'meta_keywords' => $request->meta_keywords,
];
$obj_user->update($seo_data);
//redirect
if ($request->save) {
return redirect(route('admin.users.salon.edit', ['id' => $obj_user->id]));
} elseif ($request->save_exit) {
return redirect(route('admin.schedules.bookings.index'));
}
}
}