265 lines
10 KiB
PHP
265 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\student;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\TutorBooking;
|
|
use App\Models\TutorSchedule;
|
|
use App\Models\TutorReview;
|
|
use App\Models\OfflinePayment;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Session;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class TutorBookingController extends Controller
|
|
{
|
|
public function my_bookings()
|
|
{
|
|
// Get the current timestamp for today at midnight
|
|
$todayStart = strtotime('today');
|
|
$todayEnd = strtotime('tomorrow') - 1;
|
|
|
|
// Retrieve tutors with schedules starting within today
|
|
$page_data['my_bookings'] = TutorBooking::where('student_id', auth()->user()->id)->where('start_time', '>=', $todayStart)->orderBy('id', 'desc')->paginate(10);
|
|
|
|
$page_data['my_archive_bookings'] = TutorBooking::where('student_id', auth()->user()->id)->where('start_time', '<', $todayStart)->orderBy('id', 'desc')->paginate(10);
|
|
|
|
$view_path = 'frontend.' . get_frontend_settings('theme') . '.student.my_bookings.index';
|
|
return view($view_path, $page_data);
|
|
}
|
|
|
|
public function booking_invoice($id = "")
|
|
{
|
|
$page_data['booking'] = TutorBooking::find($id);
|
|
$page_data['invoice'] = random(10);
|
|
|
|
$view_path = 'frontend.' . get_frontend_settings('theme') . '.student.my_bookings.invoice';
|
|
return view($view_path, $page_data);
|
|
}
|
|
|
|
|
|
//paymnet
|
|
public function purchase($id)
|
|
{
|
|
$schedule = TutorSchedule::find($id);
|
|
|
|
// check schedule owner
|
|
if ($schedule->tutor_id == auth()->user()->id) {
|
|
Session::flash('error', get_phrase('You own this schedule.'));
|
|
return redirect()->back();
|
|
}
|
|
|
|
// check schedule is booked or not
|
|
if (TutorBooking::where('student_id', auth()->user()->id)->where('schedule_id', $id)->exists()) {
|
|
Session::flash('error', get_phrase('Schedule is already booked.'));
|
|
return redirect()->back();
|
|
}
|
|
|
|
// check any offline processing data
|
|
$processing_payments = OfflinePayment::where([
|
|
'user_id' => auth()->user()->id,
|
|
'items' => $schedule->id,
|
|
'item_type' => 'tutor_booking',
|
|
'status' => 0,
|
|
])
|
|
->first();
|
|
|
|
if ($processing_payments) {
|
|
Session::flash('warning', get_phrase('Your request is in process.'));
|
|
return redirect()->back();
|
|
}
|
|
|
|
// prepare team package payment data
|
|
$payment_details = [
|
|
'items' => [
|
|
[
|
|
'id' => $schedule->id,
|
|
'title' => $schedule->schedule_to_tutorCategory->name,
|
|
'subtitle' => $schedule->schedule_to_tutorSubjects->name,
|
|
'price' => $schedule->schedule_to_tutorCanTeach->price,
|
|
'discount_price' => '',
|
|
],
|
|
],
|
|
|
|
'custom_field' => [
|
|
'item_type' => 'tutor_booking',
|
|
'pay_for' => get_phrase('Tutor Schedule Booking'),
|
|
],
|
|
|
|
'success_method' => [
|
|
'model_name' => 'TutorBooking',
|
|
'function_name' => 'purchase_schedule',
|
|
],
|
|
|
|
'payable_amount' => round($schedule->schedule_to_tutorCanTeach->price, 2),
|
|
'tax' => 0,
|
|
'cancel_url' => route('tutor_schedule', [$schedule->tutor_id, slugify($schedule->schedule_to_tutor->name)]),
|
|
'success_url' => route('payment.success', ''),
|
|
];
|
|
|
|
Session::put(['payment_details' => $payment_details]);
|
|
return redirect()->route('payment');
|
|
}
|
|
|
|
public function join_class($booking_id = "")
|
|
{
|
|
$current_time = time();
|
|
$extended_time = $current_time + (60 * 15);
|
|
|
|
$booking = TutorBooking::where('id', $booking_id)
|
|
->where('start_time', '<', $extended_time)
|
|
->where('student_id', auth()->user()->id)
|
|
->first();
|
|
|
|
if (!empty($booking) && $current_time > $booking->end_time) {
|
|
Session::flash('error', get_phrase('Time up! Session is over.'));
|
|
return redirect()->route('my_bookings', ['tab' => 'live-upcoming']);
|
|
}
|
|
|
|
if (! $booking) {
|
|
Session::flash('error', get_phrase('You can join the class 15 minutes before the class start or Session not found.'));
|
|
return redirect()->route('my_bookings', ['tab' => 'live-upcoming']);
|
|
}
|
|
|
|
if(empty($booking->joining_data)) {
|
|
$joining_info = $this->create_zoom_meeting($booking->booking_to_schedule->schedule_to_tutorSubjects->name, $booking->start_time);
|
|
|
|
$meeting_info = json_decode($joining_info, true);
|
|
|
|
if (array_key_exists('code', $meeting_info) && $meeting_info) {
|
|
return redirect()->back()->with('error', get_phrase($meeting_info['message']));
|
|
}
|
|
|
|
$data['joining_data'] = $joining_info;
|
|
|
|
TutorBooking::where('id', $booking_id)->update($data);
|
|
|
|
$booking->joining_data = $joining_info;
|
|
|
|
}
|
|
|
|
if (get_settings('zoom_web_sdk') == 'active') {
|
|
$page_data['booking'] = $booking;
|
|
$page_data['user'] = get_user_info($booking->student_id);
|
|
$page_data['is_host'] = 0;
|
|
|
|
$view_path = 'frontend.' . get_frontend_settings('theme') . '.student.my_bookings.join_tution';
|
|
return view($view_path, $page_data);
|
|
} else {
|
|
$meeting_info = json_decode($booking->joining_data, true);
|
|
return redirect($meeting_info['start_url']);
|
|
}
|
|
}
|
|
|
|
public function create_zoom_meeting($topic, $date_and_time)
|
|
{
|
|
$zoom_account_email = get_settings('zoom_account_email');
|
|
$token = $this->create_zoom_token();
|
|
// API Endpoint for creating a meeting
|
|
$zoomEndpoint = 'https://api.zoom.us/v2/users/me/meetings';
|
|
|
|
// Meeting data
|
|
$meetingData = [
|
|
'topic' => $topic,
|
|
'schedule_for' => $zoom_account_email,
|
|
'type' => 2, // Scheduled meeting
|
|
'start_time' => date('Y-m-d\TH:i:s', strtotime($date_and_time)), // Start time (in UTC)
|
|
'duration' => 60, // Duration in minutes
|
|
'timezone' => get_settings('timezone'), // Timezone
|
|
'settings' => [
|
|
'approval_type' => 2,
|
|
'join_before_host' => true,
|
|
'jbh_time' => 0,
|
|
],
|
|
];
|
|
// Prepare headers
|
|
$headers = [
|
|
'Authorization: Bearer ' . $token,
|
|
'Content-Type: application/json',
|
|
];
|
|
|
|
// Make POST request to create meeting
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $zoomEndpoint);
|
|
curl_setopt($ch, CURLOPT_POST, 1);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($meetingData));
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
$response = curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
// JSON response
|
|
return $response;
|
|
}
|
|
|
|
public function create_zoom_token()
|
|
{
|
|
// Access the environment variables
|
|
$clientId = get_settings('zoom_client_id');
|
|
$clientSecret = get_settings('zoom_client_secret');
|
|
$accountId = get_settings('zoom_account_id');
|
|
$oauthUrl = 'https://zoom.us/oauth/token?grant_type=account_credentials&account_id=' . $accountId; // Replace with your OAuth endpoint URL
|
|
$authHeader = 'Basic ' . base64_encode($clientId . ':' . $clientSecret);
|
|
|
|
$curl = curl_init();
|
|
|
|
curl_setopt_array($curl, array(
|
|
CURLOPT_URL => 'https://zoom.us/oauth/token?grant_type=account_credentials&account_id=' . $accountId,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_ENCODING => '',
|
|
CURLOPT_MAXREDIRS => 10,
|
|
CURLOPT_TIMEOUT => 0,
|
|
CURLOPT_FOLLOWLOCATION => true,
|
|
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
|
CURLOPT_CUSTOMREQUEST => 'POST',
|
|
CURLOPT_HTTPHEADER => array(
|
|
'Content-Type: application/x-www-form-urlencoded',
|
|
'Authorization: ' . $authHeader,
|
|
'Cookie: __cf_bm=kn5ec2sntPlDgQWVWtSYdPeISb6bp6F7NHwuAFJQaGk-1736318967-1.0.1.1-SeM4z5pIb.nrMno35jg3y5BdXib.GPP13s2_yNnqz6LxbU9zsFTfZQc3a_Di94qx3DoyQjBT2Osz7idFMWWOrw; _zm_chtaid=816; _zm_ctaid=nbT15WlMTsCEAgCyUg3rYw.1736318967206.63747957ef3128f771210fb69e8d6831; _zm_mtk_guid=fa77ae1ac8e349bea690b72d942d6de6; _zm_page_auth=us04_c_uqPDVOshQQK6FRkhQPiPRA; _zm_ssid=us04_c_atJ4QboaQZG4Lw4U-Wpx6A; cred=A404810ADF33AFC21FF517216A4CB862'
|
|
),
|
|
));
|
|
|
|
$response = curl_exec($curl);
|
|
|
|
curl_close($curl);
|
|
$oauthResponse = json_decode($response, true) ?? ['access_token' => ''];
|
|
$accessToken = $oauthResponse['access_token'];
|
|
return $accessToken;
|
|
}
|
|
|
|
public function tutor_review(Request $request)
|
|
{
|
|
$request->validate([
|
|
'rating' => 'required|integer|min:1|max:5',
|
|
'review' => 'nullable|string|max:1000',
|
|
'tutor_id' => 'required|integer|exists:users,id',
|
|
]);
|
|
|
|
$studentId = Auth::id();
|
|
$tutorId = $request->input('tutor_id');
|
|
|
|
// Check if a review already exists
|
|
$existingReview = TutorReview::where('tutor_id', $tutorId)
|
|
->where('student_id', $studentId)
|
|
->first();
|
|
|
|
if ($existingReview) {
|
|
// Update the existing review
|
|
$existingReview->update([
|
|
'rating' => $request->input('rating'),
|
|
'review' => $request->input('review'),
|
|
]);
|
|
} else {
|
|
// Create a new review
|
|
TutorReview::create([
|
|
'tutor_id' => $tutorId,
|
|
'student_id' => $studentId,
|
|
'rating' => $request->input('rating'),
|
|
'review' => $request->input('review'),
|
|
]);
|
|
}
|
|
|
|
return redirect()->back()->with('success', 'Review submitted successfully.');
|
|
}
|
|
}
|