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/ |
<?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);
}
}