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/app/Modules/Schedules/Http/Controllers/Admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/tradze/public_html/app/Modules/Schedules/Http/Controllers/Admin/DynamicPricingController.php
<?php

namespace App\Modules\Schedules\Http\Controllers\Admin;

use App\Http\Controllers\AdminController;
use App\Modules\Schedules\Http\Requests\ScheduleBusinessDaysRequest;
use App\Modules\Schedules\Http\Requests\ScheduleDaysOffRequest;
use App\Modules\Schedules\Models\DynamicPricing;
use App\Modules\Schedules\Models\ScheduleDaysOff;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Modules\Services\Models\SalonCategory;
use App\Modules\Postcodes\Models\District;
use App\Modules\Postcodes\Models\Zone;
use App\Modules\Schedules\Models\GlobalTravelCost;
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\ServiceProviderDoc;
use App\Modules\Users\Models\UserServiceDuration;
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\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Laracasts\Flash\Flash;
use Yajra\Datatables\Datatables;
use Illuminate\Support\Facades\Auth;
use App\Modules\Users\Models\TherapistMyWork;
use App\Modules\Users\Models\UserInternalNote;
use Mail;
use App\StripeSubscription;

class DynamicPricingController extends AdminController
{

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        $this->data['page_title'] = trans('schedules::bo.dynamic_pricing_title');

        $days = [
            0 => 'Default',
            1 => 'Monday',
            2 => 'Tuesday',
            3 => 'Wednesday',
            4 => 'Thursday',
            5 => 'Friday',
            6 => 'Saturday',
            7 => 'Sunday'
        ];

        $dbPrices = DynamicPricing::orderBy('day_of_week')
            ->orderBy('time_start')
            ->get()
            ->groupBy('day_of_week');

        // return $dbPrices;

        $prices = [];

        foreach ($days as $key => $day) {
            $prices[$day] = $dbPrices[$key] ?? collect([
                (object)[
                    'id'     => null,
                    'time_start' => null,
                    'time_end'   => null,
                    'price'      => null,
                    'updated_at'  => null
                ]
            ]);
        }

        $this->data['prices'] = $prices;
        // return $prices;
        return view('schedules::admin.dynamic_pricing_index', $this->data);
    }

    /**
     * Show a list of all companies
     *
     * @return mixed
     */
    public function data(Request $request)
    {
        //create object contact
        $$obj = $this->getData($request);

        //return datatables data
        return Datatables::of($obj)
            ->editColumn('name', function ($o) {
                return $this->text_closed($o, $o->name);
            })
            ->editColumn('bo_start', function ($o) {
                return $o->bo_start;
            })
            ->editColumn('bo_end', function ($o) {
                return $o->bo_end;
            })
            ->addColumn('actions', function ($o) {
                $this->data['o'] = $o;
                return view('schedules::admin.bo_list_actions', $this->data)->render();
            })
            ->removeColumn('id')
            ->removeColumn('updated_at', 'deleted_at')
            ->make(true);
    }

    /**
     * Get object entries
     * @param Request $request
     */
    protected function getData(Request $request)
    {
        $obj = DynamicPricing::all();

        //return object
        return $obj;
    }

    public function update(Request $request)
    {
        $input = $request->all();

        $days = [
            1 => 'Monday',
            2 => 'Tuesday',
            3 => 'Wednesday',
            4 => 'Thursday',
            5 => 'Friday',
            6 => 'Saturday',
            7 => 'Sunday'
        ];

        if (isset($input['default'])) {
            $defaultPrice = $input['default']['price'] ?? 0;
            $defaultPercentage = $input['default']['percentage'] ?? 0;
            $defaultTrazeCo = $input['default']['tradze_commission'] ?? 0;
            $defaultProviderCo = $input['default']['provider_commission'] ?? 0;

            // Update all entries without specific price to default
            DynamicPricing::updateOrCreate([
                'day_of_week' => 0,
                'type' => 'DEFAULT'
            ], [
                'price' => $defaultPrice,
                'percentage' => $defaultPercentage,
                'tradze_co' => $defaultTrazeCo,
                'provider_co' => $defaultProviderCo,
                'notes' => null
            ]);
        }

        foreach ($days as $key => $day) {

            if (!isset($input['pricing'][$day])) {
                $input['pricing'][$day] = []; // No slots submitted for this day
            }

            $submittedSlots = [];

            foreach ($input['pricing'][$day] as $entry) {

                if (empty($entry['from']) || empty($entry['to']) || empty($entry['price'])) {
                    continue;
                }

                $timeStart = date('H:i:s', strtotime($entry['from']));
                $timeEnd   = date('H:i:s', strtotime($entry['to']));

                $submittedSlots[] = [
                    'time_start' => $timeStart,
                    'time_end'   => $timeEnd
                ];

                // Update or create slot
                DynamicPricing::updateOrCreate(
                    [
                        'type' => 'TIMESLOT',
                        'day_of_week' => $key,
                        'time_start'  => $timeStart,
                        'time_end'    => $timeEnd
                    ],
                    [
                        'price' => $entry['price'],
                        'percentage' => $entry['percentage'] ?? 0,
                        'tradze_co' => $entry['tradze_commission'] ?? 0,
                        'provider_co' => $entry['provider_commission'] ?? 0,
                        'notes' => $entry['notes'] ?? null
                    ]
                );
            }

            // Remove only the database slots for this day that **aren't in submitted request**
            if (!empty($submittedSlots)) {
                DynamicPricing::where('day_of_week', $key)
                    ->where(function ($query) use ($submittedSlots) {
                        foreach ($submittedSlots as $slot) {
                            $query->where(function ($q) use ($slot) {
                                $q->where('time_start', '<>', $slot['time_start'])
                                    ->orWhere('time_end', '<>', $slot['time_end']);
                            });
                        }
                    })
                    ->delete();
            } else {
                // If no slots submitted at all for this day, remove all
                DynamicPricing::where('day_of_week', $key)->delete();
            }
        }

        Flash::success('Dynamic pricing updated successfully.');
        return redirect()->route('admin.schedules.dynamicpricing.index');
    }

    public function globalTravelCost()
    {
        $this->data['page_title'] = 'Global Travel Cost Management';

        return view('schedules::admin.global_travel_cost', $this->data);
    }

    public function getGlobalTravelCostData(Request $request)
    {
        $coverage_areas = DB::table("global_travel_cost")->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);
    }

    public function addGlobalTravelCost(Request $request)
    {
        if (isset($request->polygondata)) {

            $region_price = $request->region_price;
            $last_coverage_areas = DB::table("global_travel_cost")->orderBy('id', 'desc')->first();
            $last_polygon_no = !empty($last_coverage_areas->polygon_no) ? $last_coverage_areas->polygon_no + 1 : 1;
            $count = $last_polygon_no;

            foreach ($request->polygondata as $polygon) {
                foreach ($polygon as $value) {
                    $region = explode(',', $value);
                    $lat = $region[0];
                    $lng = $region[1];
                    $data = array(
                        'price'    => $region_price,
                        'polygon_no' => $count,
                        'lat'        => $lat,
                        'lng'        => $lng
                    );
                    //print_r($data);
                    DB::table("global_travel_cost")->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 deleteTravelCost(Request $request)
    {
        if (isset($request->remove_locations)) {
            foreach ($request->remove_locations as $polygon) {
                $region = explode(',', $polygon);
                $lat = $region[0];
                $lng = $region[1];
                $data = array(
                    'lat'        => $lat,
                    'lng'        => $lng
                );
                //print_r($data);
                DB::table("global_travel_cost")->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 deleteAllTravelCost(Request $request)
    {
        DB::table("global_travel_cost")->delete();
        return response(['message' => 'All Travel Cost locations deleted successfully'], 200);
    }
}

ZeroDay Forums Mini