Sh3ll
OdayForums


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/tradze/public_html/dev-test/app/Modules/Users/Http/Controllers/Admin/SalonController.php
<?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'));
        }
    }
}

ZeroDay Forums Mini