initial commit
This commit is contained in:
70
app/Http/Controllers/Admin/AgentController.php
Normal file
70
app/Http/Controllers/Admin/AgentController.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Telemedpro;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
|
||||
class AgentController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$agents = Telemedpro::all();
|
||||
return view('admin.agents.index', ['agents' => $agents]);
|
||||
}
|
||||
|
||||
public function add()
|
||||
{
|
||||
return view('admin.agents.add');
|
||||
}
|
||||
|
||||
public function save(Request $request)
|
||||
{
|
||||
$agent = Telemedpro::where('email',$request->input('email'))->first();
|
||||
if($agent)
|
||||
{
|
||||
$request->session()->flash('error', 'The email has already been taken.');
|
||||
return redirect()->back();
|
||||
}
|
||||
Telemedpro::create([
|
||||
'name' => $request->input('name'),
|
||||
'email' => $request->input('email'),
|
||||
'password' => bcrypt($request->input('password')),
|
||||
]);
|
||||
$request->session()->flash('message', 'Agent created successfully');
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$agent = Telemedpro::where('id',$id)->first();
|
||||
return view('admin.agents.edit', ['agent' => $agent]);
|
||||
}
|
||||
|
||||
public function update($id,Request $request)
|
||||
{
|
||||
$agent = Telemedpro::where('id',$id)->first();
|
||||
$request->validate([
|
||||
'name' => 'required',
|
||||
'email' => 'required|email|unique:telemed_pros,email,' . $id,
|
||||
// Other validation rules...
|
||||
]);
|
||||
$agent->name = $request->input('name');
|
||||
$agent->email = $request->input('email');
|
||||
if($request->input('password'))
|
||||
$agent->password = $request->input('password');
|
||||
$agent->save();
|
||||
|
||||
$request->session()->flash('message', 'Agent updated successfully');
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
public function delete($id,Request $request)
|
||||
{
|
||||
Telemedpro::where('id',$id)->delete();
|
||||
$request->session()->flash('message', 'Agent deleted successfully');
|
||||
return redirect()->back();
|
||||
}
|
||||
}
|
122
app/Http/Controllers/Admin/Api/AdminController.php
Normal file
122
app/Http/Controllers/Admin/Api/AdminController.php
Normal file
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Admin;
|
||||
use App\Models\Permission;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
class AdminController extends Controller
|
||||
{
|
||||
protected $user;
|
||||
protected $url;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function index(){
|
||||
try {
|
||||
$this->authorizeForUser($this->user,'list', new Admin);
|
||||
$adminData = Admin::all();
|
||||
foreach($adminData as $admin)
|
||||
{
|
||||
$admin->image_path = $this->url->to('/storage/profile_pictures/' . $admin->image_path);
|
||||
}
|
||||
|
||||
return DataTables::of($adminData)->make(true);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
|
||||
}
|
||||
public function getRoles()
|
||||
{
|
||||
$roles = Permission::select('id','role_name as role')->get();
|
||||
return response()->json([
|
||||
'data' => $roles
|
||||
], 201);
|
||||
}
|
||||
public function saveAdmin(Request $request)
|
||||
{
|
||||
$this->authorize('add', new Admin);
|
||||
$data =[
|
||||
"name" => $request->get('name'),
|
||||
"email" => $request->get('email'),
|
||||
"password" => Hash::make($request->input('password')),
|
||||
"last_name" => $request->get('last_name'),
|
||||
"phone_no" => $request->get('phone_no'),
|
||||
"role_id" => $request->get('role_id')
|
||||
];
|
||||
$admin = Admin::create($data);
|
||||
$image = $request->get('profile_pic');
|
||||
$fileName = 'profile-' . time();
|
||||
|
||||
$logo = base64_decode($image);
|
||||
$ext = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[1]);
|
||||
|
||||
$imageName = $fileName . '.' . $ext;
|
||||
Storage::disk('local')->put("/public/profile_pictures/" . $imageName, $logo);
|
||||
|
||||
$admin->image_path = $imageName;
|
||||
$admin->save();
|
||||
return response()->json([
|
||||
'success' => "Data Saved! "
|
||||
], 201);
|
||||
}
|
||||
public function editAdmin($id)
|
||||
{
|
||||
$adminData = Admin::find($id);
|
||||
|
||||
if($adminData->image_path)
|
||||
$adminData->image_path = $this->url->to('/storage/profile_pictures/' . $adminData->image_path);
|
||||
else
|
||||
$adminData->image_path='';
|
||||
|
||||
return response()->json([
|
||||
'data' => $adminData
|
||||
], 201);
|
||||
}
|
||||
public function updateAdmin($id,Request $request)
|
||||
{
|
||||
$admin = Admin::find($id);
|
||||
$admin->name = $request->get('name');
|
||||
// $admin->email = $request->get('email');
|
||||
if($request->input('password'))
|
||||
$admin->password = Hash::make($request->input('password'));
|
||||
$admin->last_name = $request->get('last_name');
|
||||
$admin->phone_no = $request->get('phone_no');
|
||||
$admin->role_id = $request->get('role_id');
|
||||
|
||||
if($request->get('profile_pic'))
|
||||
{
|
||||
$image = $request->get('profile_pic');
|
||||
$fileName = 'profile-' . time();
|
||||
|
||||
$logo = base64_decode($image);
|
||||
$ext = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[1]);
|
||||
|
||||
$imageName = $fileName . '.' . $ext;
|
||||
Storage::disk('local')->put("/public/profile_pictures/" . $imageName, $logo);
|
||||
$admin->image_path = $imageName;
|
||||
}
|
||||
|
||||
$admin->save();
|
||||
return response()->json([
|
||||
'data' => $admin
|
||||
], 201);
|
||||
}
|
||||
public function detailAdmin($id)
|
||||
{
|
||||
|
||||
$admin = Admin::find($id);
|
||||
$admin->image_path = $this->url->to('/storage/profile_pictures/' . $admin->image_path);
|
||||
return response()->json([
|
||||
'data' => $admin
|
||||
], 201);
|
||||
}
|
||||
}
|
643
app/Http/Controllers/Admin/Api/AppointmentController.php
Normal file
643
app/Http/Controllers/Admin/Api/AppointmentController.php
Normal file
@@ -0,0 +1,643 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use Agence104\LiveKit\VideoGrant;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\LabkitOrderItem;
|
||||
use App\Models\Patient;
|
||||
use App\Models\PatientRegActivity;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Telemedpro;
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonTimeZone;
|
||||
use DateTime;
|
||||
use DateTimeZone;
|
||||
use Error;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Agence104\LiveKit\AccessToken;
|
||||
use Agence104\LiveKit\AccessTokenOptions;
|
||||
use Agence104\LiveKit\RoomCreateOptions;
|
||||
use Agence104\LiveKit\RoomServiceClient;
|
||||
use Google\Protobuf\TwirpError;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
|
||||
class AppointmentController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function getAppointmentList()
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Appointment);
|
||||
$appointments = Appointment::select("patients.first_name", "patients.last_name", "telemed_pros.name as agent_name", "appointments.*") // Eager load the associated telemed pro
|
||||
->leftJoin("telemed_pros", "telemed_pros.id", "appointments.telemed_pros_id")
|
||||
->leftJoin("patients", "patients.id", "appointments.patient_id")
|
||||
/* ->orderBy('appointment_time', 'desc') */ // Optional: sort by appointment time
|
||||
->get();
|
||||
|
||||
return response()->json($appointments, 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
|
||||
return response()->json(['error' => 'Failed to retrieve appointments'], 500);
|
||||
}
|
||||
}
|
||||
public function getMeetingHistory(Patient $patient, $filter = '12_months')
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'meeting_history', new Appointment);
|
||||
$currentMonth = Carbon::now();
|
||||
|
||||
// Filter logic
|
||||
switch ($filter) {
|
||||
case 'current_month':
|
||||
$startDate = $currentMonth->copy()->startOfMonth();
|
||||
break;
|
||||
case '1_month':
|
||||
$startDate = $currentMonth->copy()->subMonth()->startOfMonth();
|
||||
break;
|
||||
case '2_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(2)->startOfMonth();
|
||||
break;
|
||||
case '3_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(3)->startOfMonth();
|
||||
break;
|
||||
case '6_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(6)->startOfMonth();
|
||||
break;
|
||||
default: // Default to 12 months
|
||||
$startDate = $currentMonth->copy()->subMonths(12)->startOfMonth();
|
||||
}
|
||||
|
||||
$endDate = $currentMonth->endOfMonth();
|
||||
|
||||
// Fetch patient names and appointment counts directly from the database
|
||||
$monthlyData = Appointment::select(
|
||||
'patient_id',
|
||||
/* DB::raw('COUNT(*) as appointment_count'), */
|
||||
'appointment_time',
|
||||
'appointment_date',
|
||||
'start_time',
|
||||
'end_time',
|
||||
'duration',
|
||||
'id'
|
||||
)
|
||||
->where("patient_id", $patient->id)
|
||||
->whereNotNull("end_time")
|
||||
->whereBetween('created_at', [$startDate, $endDate])
|
||||
|
||||
->get();
|
||||
|
||||
$patients = [];
|
||||
|
||||
foreach ($monthlyData as $dataPoint) {
|
||||
$patientName = $dataPoint->patient->first_name . " " . $dataPoint->patient->last_name; // Assuming 'name' is the field representing patient names
|
||||
/* $appointmentCount = $dataPoint->appointment_count; */
|
||||
$start_time = $dataPoint->start_time;
|
||||
$end_time = $dataPoint->end_time;
|
||||
$duration = $dataPoint->duration;
|
||||
$appointment_time = $dataPoint->appointment_time;
|
||||
$appointment_date = $dataPoint->appointment_date;
|
||||
$id = $dataPoint->id;
|
||||
|
||||
$patients[] = [
|
||||
'patient_name' => $patientName,
|
||||
'appointment_time' => $appointment_time,
|
||||
'appointment_date' => $appointment_date,
|
||||
/* 'appointment_count' => $appointmentCount, */
|
||||
'start_time' => $start_time,
|
||||
'end_time' => $end_time,
|
||||
'duration' => $duration,
|
||||
'id' => $id,
|
||||
];
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'patients' => $patients,
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
|
||||
return response()->json(['error' => 'Failed to retrieve appointments'], 500);
|
||||
}
|
||||
}
|
||||
public function getAppointmentByid($patient, $appointment, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Appointment);
|
||||
// Assuming user can be either telemedPro or patient
|
||||
$data = Appointment::select('appointments.*', 'telemed_pros.name as agent_name')
|
||||
->leftJoin('telemed_pros', 'appointments.telemed_pros_id', '=', 'telemed_pros.id')
|
||||
->where('appointments.patient_id', $patient)
|
||||
->where('appointments.id', $appointment)
|
||||
->first();
|
||||
// dd($data);
|
||||
return response()->json(['data' => $data]);
|
||||
} catch (AuthorizationException $e) {
|
||||
|
||||
return response()->json(['error' => 'Failed to retrieve appointments'], 500);
|
||||
}
|
||||
}
|
||||
public function bookAppointment(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Appointment);
|
||||
$validatedData = $request->validate([
|
||||
/* 'telemed_pros_id' => 'required|exists:telemed_pros,id', */
|
||||
'patient_id' => 'required|exists:patients,id',
|
||||
'appointment_time' => 'required|date_format:H:i:s',
|
||||
'appointment_date' => 'required|date_format:Y-m-d',
|
||||
'patient_name' => 'required',
|
||||
'patient_email' => 'required',
|
||||
'timezone' => 'required',
|
||||
]);
|
||||
try {
|
||||
$tz = new DateTimeZone($validatedData['timezone']);
|
||||
$standardTz = $tz->getName();
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'message' => $e->getMessage()
|
||||
], 400);
|
||||
}
|
||||
try {
|
||||
$timezoneMap = [
|
||||
'EST' => 'America/New_York',
|
||||
'EDT' => 'America/New_York',
|
||||
'CST' => 'America/Chicago',
|
||||
'CDT' => 'America/Chicago',
|
||||
'MST' => 'America/Denver',
|
||||
'MDT' => 'America/Denver',
|
||||
'PST' => 'America/Los_Angeles',
|
||||
'PDT' => 'America/Los_Angeles',
|
||||
// Add more mappings as needed
|
||||
];
|
||||
$timezone = $validatedData['timezone'];
|
||||
if (array_key_exists($timezone, $timezoneMap)) {
|
||||
$timezone = $timezoneMap[$timezone];
|
||||
}
|
||||
|
||||
$appointmentDateTime = new DateTime(
|
||||
$validatedData['appointment_date'] . ' ' . $validatedData['appointment_time'],
|
||||
new DateTimeZone($timezone)
|
||||
);
|
||||
|
||||
$appointmentDateTime->setTimezone(new DateTimeZone('UTC'));
|
||||
|
||||
$validatedData['appointment_time'] = $appointmentDateTime->format('H:i:s');
|
||||
$validatedData['appointment_date'] = $appointmentDateTime->format('Y-m-d');
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'message' => $e->getMessage()
|
||||
], 400);
|
||||
}
|
||||
|
||||
$availableTelemedPros = Telemedpro::select("telemed_pros.id", "telemed_pros.name")/* ->where('is_busy', false) */
|
||||
->leftJoin('appointments', function ($join) use ($validatedData) {
|
||||
$join->on('telemed_pros.id', '=', 'appointments.telemed_pros_id')
|
||||
->where('appointments.appointment_time', '=', $validatedData['appointment_time'])
|
||||
->where('appointments.appointment_date', '=', $validatedData['appointment_date']);
|
||||
})
|
||||
->whereNull('appointments.id')
|
||||
->first();
|
||||
|
||||
if (!$availableTelemedPros)
|
||||
return response()->json([
|
||||
'message' => 'Appointment time not available'
|
||||
], 400);
|
||||
|
||||
$existingAppointment = Appointment::where('telemed_pros_id', $availableTelemedPros->id)
|
||||
->where('appointment_time', $validatedData['appointment_time'])
|
||||
->where('appointment_date', $validatedData['appointment_date'])
|
||||
->first();
|
||||
|
||||
if ($existingAppointment) {
|
||||
return response()->json([
|
||||
'message' => 'Appointment time not available'
|
||||
], 400);
|
||||
}
|
||||
$validatedData['telemed_pros_id'] = $availableTelemedPros->id;
|
||||
$validatedData['status'] = 'pending';
|
||||
|
||||
// Create the appointment
|
||||
$appointment = Appointment::create($validatedData);
|
||||
$appointment_booking_tokens = $this->bookAppointmentApi($appointment, $availableTelemedPros);
|
||||
$appointment->agent_call_token = $appointment_booking_tokens['tokenAgent'];
|
||||
$appointment->patient_call_token = $appointment_booking_tokens['tokenPatient'];
|
||||
$appointment->save();
|
||||
|
||||
PatientRegActivity::create([
|
||||
'patient_id' => $validatedData['patient_id'],
|
||||
'activity' => 'patient_appointment_booked'
|
||||
]);
|
||||
$patient = $appointment->patient;
|
||||
$datetimeUtc = $appointment->appointment_date . ' ' . $appointment->appointment_time;
|
||||
$dateTimeUtc = Carbon::createFromFormat('Y-m-d H:i:s', $datetimeUtc, 'UTC');
|
||||
$appointmentTimeZone = new CarbonTimeZone($appointment->timezone);
|
||||
$dateTimeInAppointmentTimeZone = $dateTimeUtc->setTimezone($appointmentTimeZone);
|
||||
$appointment->appointment_date = $appointmentDate = $dateTimeInAppointmentTimeZone->format('Y-m-d');
|
||||
$appointment->appointment_time = $appointmentTime = $dateTimeInAppointmentTimeZone->format('H:i:s');
|
||||
$setting = Setting::find(1);
|
||||
//event(new AppointmentBooked($appointment));
|
||||
$cart = Cart::find($request->input("cart_id"));
|
||||
$cart->appointment_id = $appointment->id;
|
||||
$cart->save();
|
||||
return response()->json([
|
||||
'message' => 'Appointment booked successfully',
|
||||
'meeting_id' => $appointment->agent_call_token,
|
||||
'appointment' => $appointment,
|
||||
'appointment_time' => $validatedData['appointment_time'],
|
||||
'appointment_date' => $validatedData['appointment_date']
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
|
||||
return response()->json(['error' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
public function editAppointment(Appointment $appointment, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Appointment);
|
||||
$validatedData = $request->validate([
|
||||
'patient_id' => 'sometimes|exists:patients,id',
|
||||
'appointment_time' => 'sometimes|date_format:H:i:s',
|
||||
'appointment_date' => 'sometimes|date_format:Y-m-d',
|
||||
'patient_name' => 'sometimes|string',
|
||||
'patient_email' => 'sometimes|email',
|
||||
'timezone' => 'sometimes|string',
|
||||
]);
|
||||
|
||||
if (isset($validatedData['timezone'])) {
|
||||
try {
|
||||
$tz = new DateTimeZone($validatedData['timezone']);
|
||||
$standardTz = $tz->getName();
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'message' => $e->getMessage()
|
||||
], 400);
|
||||
}
|
||||
|
||||
$timezoneMap = [
|
||||
'EST' => 'America/New_York',
|
||||
'EDT' => 'America/New_York',
|
||||
'CST' => 'America/Chicago',
|
||||
'CDT' => 'America/Chicago',
|
||||
'MST' => 'America/Denver',
|
||||
'MDT' => 'America/Denver',
|
||||
'PST' => 'America/Los_Angeles',
|
||||
'PDT' => 'America/Los_Angeles',
|
||||
// Add more mappings as needed
|
||||
];
|
||||
|
||||
$timezone = $validatedData['timezone'];
|
||||
if (array_key_exists($timezone, $timezoneMap)) {
|
||||
$timezone = $timezoneMap[$timezone];
|
||||
}
|
||||
|
||||
if (isset($validatedData['appointment_date']) && isset($validatedData['appointment_time'])) {
|
||||
try {
|
||||
$appointmentDateTime = new DateTime(
|
||||
$validatedData['appointment_date'] . ' ' . $validatedData['appointment_time'],
|
||||
new DateTimeZone($timezone)
|
||||
);
|
||||
|
||||
$appointmentDateTime->setTimezone(new DateTimeZone('UTC'));
|
||||
|
||||
$validatedData['appointment_time'] = $appointmentDateTime->format('H:i:s');
|
||||
$validatedData['appointment_date'] = $appointmentDateTime->format('Y-m-d');
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'message' => $e->getMessage()
|
||||
], 400);
|
||||
}
|
||||
|
||||
// Check if the new time slot is available
|
||||
$availableTelemedPros = Telemedpro::select("telemed_pros.id", "telemed_pros.name")
|
||||
->leftJoin('appointments', function ($join) use ($validatedData, $appointment) {
|
||||
$join->on('telemed_pros.id', '=', 'appointments.telemed_pros_id')
|
||||
->where('appointments.appointment_time', '=', $validatedData['appointment_time'])
|
||||
->where('appointments.appointment_date', '=', $validatedData['appointment_date'])
|
||||
->where('appointments.id', '!=', $appointment->id); // Exclude the current appointment
|
||||
})
|
||||
->whereNull('appointments.id')
|
||||
->first();
|
||||
|
||||
if (!$availableTelemedPros) {
|
||||
return response()->json([
|
||||
'message' => 'New appointment time not available'
|
||||
], 400);
|
||||
}
|
||||
|
||||
// Update the telemed_pros_id if it's different
|
||||
if ($availableTelemedPros->id !== $appointment->telemed_pros_id) {
|
||||
$validatedData['telemed_pros_id'] = $availableTelemedPros->id;
|
||||
|
||||
// Re-book the appointment with the new telemed pro
|
||||
$appointment_booking_tokens = $this->bookAppointmentApi($appointment, $availableTelemedPros);
|
||||
$validatedData['agent_call_token'] = $appointment_booking_tokens['tokenAgent'];
|
||||
$validatedData['patient_call_token'] = $appointment_booking_tokens['tokenPatient'];
|
||||
}
|
||||
}
|
||||
|
||||
// Update the appointment
|
||||
$appointment->update($validatedData);
|
||||
|
||||
// Update related cart if it exists
|
||||
$cart = Cart::where('appointment_id', $appointment->id)->first();
|
||||
if ($cart) {
|
||||
$cart->appointment_id = $appointment->id;
|
||||
$cart->save();
|
||||
}
|
||||
|
||||
// Convert appointment time to the specified timezone for the response
|
||||
$datetimeUtc = $appointment->appointment_date . ' ' . $appointment->appointment_time;
|
||||
$dateTimeUtc = Carbon::createFromFormat('Y-m-d H:i:s', $datetimeUtc, 'UTC');
|
||||
$appointmentTimeZone = new CarbonTimeZone($appointment->timezone);
|
||||
$dateTimeInAppointmentTimeZone = $dateTimeUtc->setTimezone($appointmentTimeZone);
|
||||
$appointmentDate = $dateTimeInAppointmentTimeZone->format('Y-m-d');
|
||||
$appointmentTime = $dateTimeInAppointmentTimeZone->format('H:i:s');
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Appointment updated successfully',
|
||||
'meeting_id' => $appointment->agent_call_token,
|
||||
'appointment' => $appointment,
|
||||
'appointment_time' => $appointmentTime,
|
||||
'appointment_date' => $appointmentDate
|
||||
]);
|
||||
}
|
||||
} catch (AuthorizationException $e) {
|
||||
return response()->json(['error' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
public function bookAppointmentApi($appointment, $availableTelemedPros)
|
||||
{
|
||||
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'edit', new Appointment);
|
||||
$roomName = 'appointment-' . $appointment->id . "-" . uniqid();
|
||||
$opts = (new RoomCreateOptions())
|
||||
->setName($roomName)
|
||||
->setEmptyTimeout(10)
|
||||
->setMaxParticipants(5);
|
||||
$host = "https://plugnmeet.codelfi.com";
|
||||
$svc = new RoomServiceClient($host, config('app.LK_API_KEY'), config('app.LK_API_SECRET'));
|
||||
$room = $svc->createRoom($opts);
|
||||
|
||||
$participantPatientName = "patient-" . uniqid() . $appointment->patient->first_name . " " . $appointment->patient->last_name;
|
||||
|
||||
$tokenOptionsPatient = (new AccessTokenOptions())
|
||||
->setIdentity($participantPatientName);
|
||||
$videoGrantPatient = (new VideoGrant())
|
||||
->setRoomJoin()
|
||||
->setRoomName($roomName);
|
||||
$tokenPatient = (new AccessToken(config('app.LK_API_KEY'), config('app.LK_API_SECRET')))
|
||||
->init($tokenOptionsPatient)
|
||||
->setGrant($videoGrantPatient)
|
||||
->toJwt();
|
||||
|
||||
$participantAgentName = "agent-" . uniqid() . $availableTelemedPros->name;
|
||||
$tokenOptionsAgent = (new AccessTokenOptions())
|
||||
->setIdentity($participantAgentName);
|
||||
$videoGrantAgent = (new VideoGrant())
|
||||
->setRoomJoin()
|
||||
->setRoomName($roomName);
|
||||
$tokenAgent = (new AccessToken(config('app.LK_API_KEY'), config('app.LK_API_SECRET')))
|
||||
->init($tokenOptionsAgent)
|
||||
->setGrant($videoGrantAgent)
|
||||
->toJwt();
|
||||
return [
|
||||
'tokenPatient' => $tokenPatient,
|
||||
'tokenAgent' => $tokenAgent,
|
||||
];
|
||||
} catch (AuthorizationException | Error | Exception | TwirpError $e) {
|
||||
|
||||
return response()->json(['error' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
public function availableSlots($date)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'book_appointment', new Appointment);
|
||||
// Ensure date is in a valid format
|
||||
$date = Carbon::parse($date);
|
||||
$originalDate = Carbon::parse($date);
|
||||
|
||||
// Generate all possible 30-minute slots between 9 AM and 4 PM
|
||||
$slots = collect();
|
||||
$startTime = Carbon::parse($date)->subHours(24)->setTime(9, 0, 0);
|
||||
$endTime = Carbon::parse($date)->addHours(24)->setTime(16, 0, 0);
|
||||
while ($startTime < $endTime) {
|
||||
$slots->push($startTime->format('Y-m-d H:i:s'));
|
||||
$startTime->addMinutes(15);
|
||||
}
|
||||
|
||||
/* $user = Patient::find($patient_id); */
|
||||
// Filter out booked slots
|
||||
$bookedAppointments = Appointment::where('appointment_date', '>=', $date->format('Y-m-d'))
|
||||
->where('appointment_date', '<', $date->addDay()->format('Y-m-d'))
|
||||
->pluck('appointment_date');
|
||||
|
||||
$availableSlots = $slots->diff($bookedAppointments);
|
||||
|
||||
$formattedSlots = $availableSlots->map(function ($slot) {
|
||||
$start = Carbon::parse($slot);
|
||||
$startTime = $start->format('Y-m-d H:i:s');
|
||||
return $startTime;
|
||||
});
|
||||
|
||||
// Additional checking if slot is booked
|
||||
$formattedSlots = $formattedSlots->filter(function ($slot) use ($originalDate) {
|
||||
$time = Carbon::parse($slot);
|
||||
return !Appointment::where('appointment_time', $time->format('H:i:s'))
|
||||
->where('appointment_date', $originalDate->format('Y-m-d'))
|
||||
->exists();
|
||||
});
|
||||
|
||||
return response()->json([
|
||||
'available_slots' => $formattedSlots->toArray()
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
|
||||
return response()->json(['error' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
public function getItemByOrder($order_id)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Appointment);
|
||||
$labkits = LabkitOrderItem::leftJoin(
|
||||
'lab_kit',
|
||||
'labkit_order_items.lab_kit_id',
|
||||
'lab_kit.id'
|
||||
)
|
||||
->leftJoin(
|
||||
'items',
|
||||
'items.id',
|
||||
'labkit_order_items.item_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'plans_v1',
|
||||
'plans_v1.id',
|
||||
'items.plans_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'carts',
|
||||
'carts.id',
|
||||
'labkit_order_items.cart_id'
|
||||
)
|
||||
->where('carts.id', $order_id)
|
||||
->select(
|
||||
'labkit_order_items.id',
|
||||
'labkit_order_items.status',
|
||||
'labkit_order_items.result',
|
||||
'lab_kit.name as lab_kit_name',
|
||||
'plans_v1.id as product_id',
|
||||
'plans_v1.title as product_name'
|
||||
)
|
||||
->get();
|
||||
return response()->json([
|
||||
'order_item' => $labkits
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
|
||||
return response()->json(['error' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
public function getAgentLastAppointment(Patient $patient, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Appointment);
|
||||
$appointments = Appointment::select(
|
||||
"patients.first_name",
|
||||
"patients.last_name",
|
||||
"telemed_pros.name as agent_name",
|
||||
"appointments.*",
|
||||
"carts.shipping_address1",
|
||||
"carts.shipping_address2",
|
||||
"carts.id as order_id",
|
||||
"carts.shipping_city",
|
||||
"carts.shipping_state",
|
||||
"carts.shipping_zipcode",
|
||||
"carts.shipping_country"
|
||||
|
||||
) // Eager load the associated telemed pro
|
||||
->leftJoin("telemed_pros", "telemed_pros.id", "appointments.telemed_pros_id")
|
||||
->leftJoin("patients", "patients.id", "appointments.patient_id")
|
||||
->leftJoin("carts", "carts.appointment_id", "appointments.id")
|
||||
->where("appointments.patient_id", $patient->id)
|
||||
->orderBy('appointments.created_at', 'desc')
|
||||
->first();
|
||||
|
||||
$upcoming_appointments = Appointment::select(
|
||||
"patients.first_name",
|
||||
"patients.last_name",
|
||||
"telemed_pros.name as agent_name",
|
||||
"appointments.*",
|
||||
"carts.shipping_address1",
|
||||
"carts.shipping_address2",
|
||||
"carts.id as order_id",
|
||||
"carts.shipping_city",
|
||||
"carts.shipping_state",
|
||||
"carts.shipping_zipcode",
|
||||
"carts.shipping_country",
|
||||
"appointments.id as order_appointment_id"
|
||||
|
||||
) // Eager load the associated telemed pro
|
||||
->leftJoin("telemed_pros", "telemed_pros.id", "appointments.telemed_pros_id")
|
||||
->leftJoin("patients", "patients.id", "appointments.patient_id")
|
||||
->leftJoin("carts", "carts.appointment_id", "appointments.id")
|
||||
//->where('appointments.appointment_date', '<', $appointments->appointment_date)
|
||||
->where("appointments.patient_id", $patient->id)
|
||||
->where("appointments.status", 'pending')
|
||||
->whereNull("appointments.start_time")
|
||||
|
||||
->orderBy('appointments.created_at', 'desc')
|
||||
->get();
|
||||
|
||||
if (!$appointments)
|
||||
return response()->json(['error' => 'No Record found.'], 500);
|
||||
|
||||
$timezone = config('app.timezone');
|
||||
if ($appointments->timezone) {
|
||||
|
||||
$tz = new DateTimeZone($appointments->timezone);
|
||||
|
||||
$standardTz = $tz->getName();
|
||||
$appointmentDateTime = $appointmentCurrent = Carbon::parse($appointments->appointment_date . ' ' . $appointments->appointment_time)->shiftTimezone($standardTz);
|
||||
//$appointmentDateTime = $appointmentDateTime->shiftTimezone($timezone);
|
||||
|
||||
$appointmentCurrent = Carbon::now($timezone);
|
||||
|
||||
$diff = $appointmentDateTime->diff($appointmentCurrent);
|
||||
|
||||
if ($diff->invert == 0) {
|
||||
// Appointment is in future, increment count
|
||||
$diff = $diff->format('0 days 0 hours 0 minutes 0 seconds');
|
||||
} else
|
||||
|
||||
$diff = $diff->format('%a days %h hours %i minutes %s seconds');
|
||||
} else {
|
||||
$diff = "";
|
||||
}
|
||||
$filePath = public_path("assets/profiles/{$patient->id}.png");
|
||||
|
||||
if ($patient->profile_picture)
|
||||
$patient->profile_picture = $this->url->to("storage/profile_pictures", $patient->profile_picture);
|
||||
else
|
||||
$patient->profile_picture = null;
|
||||
|
||||
if (File::exists($filePath)) {
|
||||
$patient->url = "/assets/profiles/{$patient->id}.png";
|
||||
} else {
|
||||
$patient->url = null;
|
||||
}
|
||||
foreach ($upcoming_appointments as $upcoming_appointment) {
|
||||
|
||||
if ($upcoming_appointment->timezone) {
|
||||
|
||||
$tz = new DateTimeZone($upcoming_appointment->timezone);
|
||||
|
||||
$standardTz = $tz->getName();
|
||||
$appointmentDateTime = $appointmentCurrent = Carbon::parse($upcoming_appointment->appointment_date . ' ' . $upcoming_appointment->appointment_time)->shiftTimezone($standardTz);
|
||||
//$appointmentDateTime = $appointmentDateTime->shiftTimezone($timezone);
|
||||
|
||||
$appointmentCurrent = Carbon::now($timezone);
|
||||
|
||||
$diff = $appointmentDateTime->diff($appointmentCurrent);
|
||||
|
||||
if ($diff->invert == 0) {
|
||||
// Appointment is in future, increment count
|
||||
$diff = $diff->format('0 days 0 hours 0 minutes 0 seconds');
|
||||
} else
|
||||
|
||||
$diff = $diff->format('%a days %h hours %i minutes %s seconds');
|
||||
} else {
|
||||
$diff = "";
|
||||
}
|
||||
|
||||
$upcoming_appointment->items_data = $this->getOrderItems($upcoming_appointment->order_id);
|
||||
$upcoming_appointment->time_diff = $diff;
|
||||
}
|
||||
|
||||
return response()->json(['upcoming_appointments' => $upcoming_appointments, 'appointment' => $appointments, 'time_diff' => $diff, 'patient' => $patient, "items_data" => $this->getOrderItems($appointments->order_id)], 200);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json(['error' => 'Failed to retrieve appointments'], 500);
|
||||
}
|
||||
}
|
||||
}
|
110
app/Http/Controllers/Admin/Api/CalendlyController.php
Normal file
110
app/Http/Controllers/Admin/Api/CalendlyController.php
Normal file
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Classes\Calendly;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Setting;
|
||||
use Carbon\Carbon;
|
||||
use DateTime;
|
||||
use Illuminate\Http\Request;
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
|
||||
class CalendlyController extends Controller
|
||||
{
|
||||
public function getCalendlyAuthUrl()
|
||||
{
|
||||
$calendly = new Calendly();
|
||||
$url = $calendly->authUrl();
|
||||
return response()->json(['url' => $url]);
|
||||
}
|
||||
public function getRedirectCode(Request $request)
|
||||
{
|
||||
$calendly = new Calendly();
|
||||
$calendly->authorize($request->input("code"));
|
||||
return redirect("https://webmd-provider.codelfi.com/build/admin/dashboard");
|
||||
}
|
||||
public function getEvent(Request $request)
|
||||
{
|
||||
$calendly = new Calendly();
|
||||
$events = $calendly->eventTypes();
|
||||
$final_event = [];
|
||||
foreach ($events as $event) {
|
||||
$array = [];
|
||||
$array['slug'] = $event['slug'];
|
||||
$array['uri'] = $event['uri'];
|
||||
$array['type'] = $event['type'];
|
||||
array_push($final_event, $array);
|
||||
//$final_event[] += $array;
|
||||
}
|
||||
return response()->json(['message' => 'Admin has been authenticated.', 'events' => $final_event], 200);
|
||||
}
|
||||
public function setEvent(Request $request)
|
||||
{
|
||||
$uri = $request->input('url');
|
||||
$calendly = new Calendly();
|
||||
$calendly->setEventUri($uri);
|
||||
return response()->json(['message' => 'Event URI selected.'], 200);
|
||||
}
|
||||
public function resetEventUri()
|
||||
{
|
||||
$calendly = new Calendly();
|
||||
$calendly->resetEventUri();
|
||||
return response()->json(['message' => 'Event URI reset!.'], 200);
|
||||
}
|
||||
|
||||
public function getAvailableDates(Request $request)
|
||||
{
|
||||
$setting = Setting::find(1);
|
||||
$month = $request->input("month");
|
||||
$timezone = $request->input("timezone");
|
||||
|
||||
$calendly = new Calendly();
|
||||
|
||||
$slots = $calendly->getAvailableDates($setting->event_type, $month, $timezone);
|
||||
|
||||
return response()->json(['slots' => $slots], 200);
|
||||
}
|
||||
public function generateHexString($length = 32)
|
||||
{
|
||||
return bin2hex(random_bytes($length / 2));
|
||||
}
|
||||
public function generateRandomString($length = 37)
|
||||
{
|
||||
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-';
|
||||
$charactersLength = strlen($characters);
|
||||
$randomString = '';
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$randomString .= $characters[rand(0, $charactersLength - 1)];
|
||||
}
|
||||
return $randomString;
|
||||
}
|
||||
|
||||
public function bookSchedule(Request $request)
|
||||
{
|
||||
$referel = $url = $request->input("url");
|
||||
$patient_email = $request->input("patient_email");
|
||||
$patient_name = $request->input("patient_name");
|
||||
$timezone = $request->input("timezone");
|
||||
$calendly = new Calendly();
|
||||
|
||||
$attempts = 0;
|
||||
$maxAttempts = 3;
|
||||
|
||||
while ($attempts < $maxAttempts) {
|
||||
$response = $calendly->bookEvent($url, $patient_name, $patient_email, $timezone);
|
||||
$response = json_decode($response, true);
|
||||
|
||||
if ($response && isset($response["event"]['start_time'])) {
|
||||
return response()->json(['success' => 'Event has been booked. ' . $response["event"]['start_time']], 200);
|
||||
}
|
||||
|
||||
$attempts++;
|
||||
}
|
||||
|
||||
return response()->json(['error' => 'Failed to complete the request after ' . $maxAttempts . ' attempts', 'response' => $response], 400);
|
||||
}
|
||||
}
|
366
app/Http/Controllers/Admin/Api/CalendlyControllerOld.php
Normal file
366
app/Http/Controllers/Admin/Api/CalendlyControllerOld.php
Normal file
@@ -0,0 +1,366 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Carbon\Carbon;
|
||||
use DateTime;
|
||||
use Illuminate\Http\Request;
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class CalendlyControllerOld extends Controller
|
||||
{
|
||||
protected $clientId = "eOk7Vb-60_l6U4WmAe9y9MThi-WKGzEuyru_B3I2jwk";
|
||||
protected $clientSecret = "EYLgGEHLudI65wdqG7Qz1azZwFCFx8kvikXYoM2EbiE";
|
||||
protected $redirectUri = 'https://hgh.codelfi.com/calendly/redirect-code/';
|
||||
|
||||
// Generate Calendly authorization URL
|
||||
public function getCalendlyAuthUrl()
|
||||
{
|
||||
$url = 'https://auth.calendly.com/oauth/authorize';
|
||||
$url .= '?client_id=' . urlencode($this->clientId);
|
||||
$url .= '&response_type=code';
|
||||
$url .= '&redirect_uri=' . urlencode($this->redirectUri);
|
||||
|
||||
return response()->json(['url' => $url]);
|
||||
}
|
||||
|
||||
// Handle the redirect with authorization code and exchange for access token
|
||||
public function getRedirectCode(Request $request)
|
||||
{
|
||||
// Get the authorization code from the request
|
||||
$authorizationCode = $request->input('code');
|
||||
|
||||
if (!$authorizationCode) {
|
||||
return response()->json(['error' => 'Authorization code is missing'], 400);
|
||||
}
|
||||
//return $this->getCalendlyUserAndAvailability();
|
||||
// Call method to fetch access token and cache it
|
||||
$this->getAccessTokenFromCode($authorizationCode);
|
||||
return response()->json(['message' => 'Admin has been authenticated.'], 200);
|
||||
}
|
||||
// Handle the redirect with authorization code and exchange for access token
|
||||
public function getAvailabeSlotDates(Request $request)
|
||||
{
|
||||
return $this->getCalendlyUserAndAvailability();
|
||||
// Call method to fetch access token and cache it
|
||||
}
|
||||
|
||||
// Fetch or refresh access token if needed
|
||||
public function getAccessToken()
|
||||
{
|
||||
// Check if the access token exists in cache
|
||||
if (Cache::has('calendly_access_token')) {
|
||||
return Cache::get('calendly_access_token');
|
||||
}
|
||||
|
||||
// If no token is available, return error or trigger refresh
|
||||
return response()->json(['error' => 'No valid access token. Please authenticate again.'], 401);
|
||||
}
|
||||
|
||||
// Exchange authorization code for access token and store it in cache
|
||||
private function getAccessTokenFromCode($authorizationCode)
|
||||
{
|
||||
$tokenUrl = 'https://auth.calendly.com/oauth/token';
|
||||
|
||||
// Use GuzzleHttp client to make the POST request
|
||||
$client = new Client();
|
||||
|
||||
try {
|
||||
$response = $client->post($tokenUrl, [
|
||||
'form_params' => [
|
||||
'grant_type' => 'authorization_code',
|
||||
'client_id' => $this->clientId,
|
||||
'client_secret' => $this->clientSecret,
|
||||
'redirect_uri' => $this->redirectUri,
|
||||
'code' => $authorizationCode,
|
||||
],
|
||||
'headers' => [
|
||||
'Content-Type' => 'application/x-www-form-urlencoded',
|
||||
],
|
||||
]);
|
||||
|
||||
// Decode the JSON response
|
||||
$data = json_decode($response->getBody()->getContents(), true);
|
||||
|
||||
// Store access token and refresh token in cache with an expiration
|
||||
//Cache::put('calendly_access_token', $data['access_token'], now()->addSeconds($data['expires_in']));
|
||||
//Cache::put('calendly_refresh_token', $data['refresh_token'], now()->addDays(30)); // Refresh tokens don't expire until used
|
||||
|
||||
return response()->json([
|
||||
'access_token' => $data['access_token'],
|
||||
'refresh_token' => $data['refresh_token'],
|
||||
'token_type' => $data['token_type'],
|
||||
'expires_in' => $data['expires_in']
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
// Handle errors
|
||||
return response()->json(['error' => 'Failed to fetch access token: ' . $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
// Use refresh token to get a new access token when expired
|
||||
private function refreshAccessToken()
|
||||
{
|
||||
if (!Cache::has('calendly_refresh_token')) {
|
||||
return response()->json(['error' => 'Refresh token not available.'], 401);
|
||||
}
|
||||
|
||||
$refreshToken = Cache::get('calendly_refresh_token');
|
||||
|
||||
$tokenUrl = 'https://auth.calendly.com/oauth/token';
|
||||
|
||||
$client = new Client();
|
||||
|
||||
try {
|
||||
$response = $client->post($tokenUrl, [
|
||||
'form_params' => [
|
||||
'grant_type' => 'refresh_token',
|
||||
'client_id' => $this->clientId,
|
||||
'client_secret' => $this->clientSecret,
|
||||
'refresh_token' => $refreshToken,
|
||||
],
|
||||
'headers' => [
|
||||
'Content-Type' => 'application/x-www-form-urlencoded',
|
||||
],
|
||||
]);
|
||||
|
||||
// Decode the response
|
||||
$data = json_decode($response->getBody()->getContents(), true);
|
||||
|
||||
// Store the new access token and refresh token in cache
|
||||
Cache::put('calendly_access_token', $data['access_token'], now()->addSeconds($data['expires_in']));
|
||||
Cache::put('calendly_refresh_token', $data['refresh_token'], now()->addDays(30)); // New refresh token
|
||||
|
||||
return $data['access_token'];
|
||||
} catch (\Exception $e) {
|
||||
return response()->json(['error' => 'Failed to refresh access token: ' . $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
function getCalendlyUserAndAvailability()
|
||||
{
|
||||
// Get the access token from cache
|
||||
$accessToken = Cache::get('calendly_access_token');
|
||||
|
||||
// If the token is not in cache, fetch a new one
|
||||
if (!$accessToken) {
|
||||
$accessToken = $this->fetchCalendlyAccessToken();
|
||||
}
|
||||
|
||||
if (!$accessToken) {
|
||||
return response()->json(['error' => 'Token Expired!'], 500);
|
||||
}
|
||||
|
||||
// 1. Call the /users/me API to get user information
|
||||
$client = new Client();
|
||||
try {
|
||||
$response = $client->request('GET', 'https://api.calendly.com/users/me', [
|
||||
'headers' => [
|
||||
'Authorization' => 'Bearer ' . $accessToken,
|
||||
'Content-Type' => 'application/json',
|
||||
]
|
||||
]);
|
||||
|
||||
$data = json_decode($response->getBody(), true);
|
||||
$userUri = $data['resource']['uri'];
|
||||
} catch (\Exception $e) {
|
||||
return response()->json(['error' => 'Failed to fetch user details: ' . $e->getMessage()], 500);
|
||||
}
|
||||
|
||||
// 2. Use the user URI to fetch availability schedules
|
||||
try {
|
||||
$availabilityResponse = $client->request('GET', 'https://api.calendly.com/user_availability_schedules', [
|
||||
'headers' => [
|
||||
'Authorization' => 'Bearer ' . $accessToken,
|
||||
'Content-Type' => 'application/json',
|
||||
],
|
||||
'query' => [
|
||||
'user' => $userUri
|
||||
]
|
||||
]);
|
||||
|
||||
$availabilityData = json_decode($availabilityResponse->getBody(), true);
|
||||
// Get the rules from the availability data
|
||||
$rules = $availabilityData['collection'][0]['rules'];
|
||||
|
||||
// Map day of the week to the date in the current week
|
||||
$weekDates = $this->getCurrentWeekDates(); // Get this week's dates
|
||||
|
||||
// Add the corresponding date to each rule
|
||||
$updatedRules = array_map(function ($rule) use ($weekDates) {
|
||||
$wday = $rule['wday'];
|
||||
// Check if we have a corresponding date for this weekday
|
||||
if (isset($weekDates[$wday])) {
|
||||
$rule['date'] = $weekDates[$wday]; // Add date to the rule
|
||||
} else {
|
||||
$rule['date'] = null; // No availability on that day
|
||||
}
|
||||
return $rule;
|
||||
}, $rules);
|
||||
|
||||
// Add the updated rules with dates back to the response
|
||||
$availabilityData['collection'][0]['rules'] = $updatedRules; // Get the rules from the availability data
|
||||
$rules = $availabilityData['collection'][0]['rules'];
|
||||
|
||||
// Map day of the week to the date in the current week
|
||||
$weekDates = $this->getCurrentWeekDates(); // Get this week's dates
|
||||
|
||||
// Add the corresponding date to each rule
|
||||
$updatedRules = array_map(function ($rule) use ($weekDates) {
|
||||
$wday = $rule['wday'];
|
||||
// Check if we have a corresponding date for this weekday
|
||||
if (isset($weekDates[$wday])) {
|
||||
$rule['date'] = $weekDates[$wday]; // Add date to the rule
|
||||
} else {
|
||||
$rule['date'] = null; // No availability on that day
|
||||
}
|
||||
return $rule;
|
||||
}, $rules);
|
||||
|
||||
$filteredDates = array_values(array_filter(array_map(function ($rule) {
|
||||
return !empty($rule['intervals']) ? $rule['date'] : null;
|
||||
}, $updatedRules)));
|
||||
// Add the updated rules with dates back to the response
|
||||
$availabilityData['collection'][0]['rules'] = $updatedRules;
|
||||
return response()->json($availabilityData, 200);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json(['error' => 'Failed to fetch availability: ' . $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
private function getCurrentWeekDates()
|
||||
{
|
||||
$weekDates = [];
|
||||
|
||||
// Start from Sunday as 0, loop through the week
|
||||
for ($day = 0; $day < 7; $day++) {
|
||||
$carbonDate = Carbon::now()->startOfWeek()->addDays($day); // Start on Sunday
|
||||
$weekday = strtolower($carbonDate->format('l')); // Get the day name (sunday, monday, etc.)
|
||||
$weekDates[$weekday] = $carbonDate->toDateString(); // Store the date for that day
|
||||
}
|
||||
|
||||
return $weekDates; // Return array of week dates
|
||||
}
|
||||
// Helper function to fetch access token
|
||||
function fetchCalendlyAccessToken()
|
||||
{
|
||||
$client = new Client();
|
||||
try {
|
||||
$response = $client->post('https://auth.calendly.com/oauth/token', [
|
||||
'form_params' => [
|
||||
'grant_type' => 'authorization_code',
|
||||
'client_id' => $this->clientId,
|
||||
'client_secret' => $this->clientSecret,
|
||||
'redirect_uri' => $this->redirectUri,
|
||||
'code' => request()->input('code'), // Get authorization code from request
|
||||
],
|
||||
'headers' => [
|
||||
'Content-Type' => 'application/x-www-form-urlencoded',
|
||||
]
|
||||
]);
|
||||
|
||||
$data = json_decode($response->getBody(), true);
|
||||
$accessToken = $data['access_token'];
|
||||
|
||||
// Store access token in cache for 2 hours
|
||||
Cache::put('calendly_access_token', $accessToken, 120 * 60);
|
||||
|
||||
return $accessToken;
|
||||
} catch (\Exception $e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public function getAvailableTimes(Request $request)
|
||||
{
|
||||
try {
|
||||
// Validate start_time and end_time input
|
||||
/* $validatedData = $request->validate([
|
||||
'start_time' => 'required|date_format:Y-m-d\TH:i:s\Z',
|
||||
'end_time' => 'required|date_format:Y-m-d\TH:i:s\Z',
|
||||
]); */
|
||||
|
||||
// Get the access token from cache
|
||||
$accessToken = Cache::get('calendly_access_token');
|
||||
|
||||
// If the token is not in cache, fetch a new one
|
||||
if (!$accessToken) {
|
||||
$accessToken = $this->fetchCalendlyAccessToken();
|
||||
}
|
||||
|
||||
if (!$accessToken) {
|
||||
return response()->json(['error' => 'Unable to retrieve access token'], 500);
|
||||
}
|
||||
|
||||
// 1. Call the /users/me API to get user information
|
||||
$client = new Client();
|
||||
$response = $client->request('GET', 'https://api.calendly.com/users/me', [
|
||||
'headers' => [
|
||||
'Authorization' => 'Bearer ' . $accessToken,
|
||||
'Content-Type' => 'application/json',
|
||||
]
|
||||
]);
|
||||
|
||||
$data = json_decode($response->getBody(), true);
|
||||
$userUri = $data['resource']['uri'];
|
||||
|
||||
// 1. Call the /users/me API to get user information
|
||||
$client = new Client();
|
||||
$responseEvent = $client->request('GET', 'https://api.calendly.com/event_types?user=' . $userUri, [
|
||||
'headers' => [
|
||||
'Authorization' => 'Bearer ' . $accessToken,
|
||||
'Content-Type' => 'application/json',
|
||||
]
|
||||
]);
|
||||
|
||||
$dataEvent = json_decode($responseEvent->getBody(), true);
|
||||
$even_type_url = $dataEvent['collection'][0]['uri'];
|
||||
$userUri = $data['resource']['uri'];
|
||||
|
||||
|
||||
$client = new Client();
|
||||
|
||||
// Prepare API endpoint with the required parameters
|
||||
$eventTypeUrl = 'https://api.calendly.com/event_type_available_times';
|
||||
$queryParams = [
|
||||
'event_type' => $even_type_url, //'https://api.calendly.com/event_types/60992c14-2f0b-42c2-af7b-95062d065600', // Use your event_type URL
|
||||
'start_time' => $request->input('start_time'),
|
||||
'end_time' => $request->input('end_time')
|
||||
];
|
||||
$str = "event_type=" . urlencode($queryParams['event_type']) . "&" . "start_time=" . urlencode($queryParams['start_time']) . "&" . "end_time=" . urlencode($queryParams['end_time']);
|
||||
$eventTypeUrl = $eventTypeUrl . "?" . ($str);
|
||||
// Send the request to Calendly
|
||||
$response = $client->request('GET', $eventTypeUrl, [
|
||||
'headers' => [
|
||||
'Authorization' => 'Bearer ' . $accessToken,
|
||||
'Content-Type' => 'application/json',
|
||||
],
|
||||
// 'query' => $queryParams
|
||||
]);
|
||||
|
||||
$data = json_decode($response->getBody(), true);
|
||||
$processedTimes = array_map(function ($item) {
|
||||
$dateTime = new DateTime($item['start_time']);
|
||||
$readableTime = $dateTime->format('Y-m-d H:i'); // Format: YYYY-MM-DD h:mm AM/PM
|
||||
|
||||
return [
|
||||
'status' => $item['status'],
|
||||
'start_time' => $readableTime,
|
||||
'invitees_remaining' => $item['invitees_remaining'],
|
||||
'scheduling_url' => $item['scheduling_url']
|
||||
];
|
||||
}, $data['collection']);
|
||||
|
||||
// Extract scheduling URLs from available time slots
|
||||
$availableTimes = array_map(function ($slot) {
|
||||
return $slot['scheduling_url'];
|
||||
}, $data['collection']);
|
||||
|
||||
return response()->json([
|
||||
'available_times' => $processedTimes
|
||||
], 200);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json(['error' => 'Failed to fetch available times: ' . $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
}
|
352
app/Http/Controllers/Admin/Api/DashboardController.php
Normal file
352
app/Http/Controllers/Admin/Api/DashboardController.php
Normal file
@@ -0,0 +1,352 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Classes\Constant;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Admin;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\Item;
|
||||
use App\Models\Lab;
|
||||
use App\Models\MedicalHistoryAnswer;
|
||||
use App\Models\Patient;
|
||||
use App\Models\PatientRegActivity;
|
||||
use App\Models\Plan;
|
||||
use App\Models\PlanV1;
|
||||
use App\Models\ProfileAnswer;
|
||||
use App\Models\QuestionBuilder;
|
||||
use App\Models\Telemedpro;
|
||||
use App\Permissions\Permissions;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Ods\Settings;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class DashboardController extends Controller
|
||||
{
|
||||
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function getStats()
|
||||
{
|
||||
|
||||
|
||||
$date = Carbon::now();
|
||||
$startOfWeek = $date->startOfWeek(Carbon::MONDAY)->format("Y-m-d");
|
||||
$endDate = Carbon::now()->format('Y-m-d');
|
||||
$newPatients = self::getNewPatients($startOfWeek, $endDate);
|
||||
$newProviders = self::getNewProviders($newPatients, $endDate);
|
||||
$analytics = self::getAnalytics();
|
||||
$upcomingMeetings = Appointment::where('appointment_date', '>=', $date->toDateString())->count();
|
||||
return response()->json([
|
||||
'upcoming_meetings' => $upcomingMeetings,
|
||||
'new_customers' => $newPatients,
|
||||
'new_providers' => $newProviders,
|
||||
'analytics' => $analytics
|
||||
]);
|
||||
}
|
||||
protected function getNewPatients($newPatients, $endOfWeek)
|
||||
{
|
||||
$upcomingMeetings = Patient::where('created_at', '>=', $newPatients)
|
||||
->where('created_at', '<=', $endOfWeek)
|
||||
->count();
|
||||
return $upcomingMeetings;
|
||||
}
|
||||
protected function getNewProviders($newPatients, $endOfWeek)
|
||||
{
|
||||
$upcomingMeetings = Telemedpro::where('created_at', '>=', $newPatients)
|
||||
->where('created_at', '<=', $endOfWeek)
|
||||
->count();
|
||||
return $upcomingMeetings;
|
||||
}
|
||||
protected function getAnalytics($filter = '12_months')
|
||||
{
|
||||
$currentMonth = Carbon::now();
|
||||
|
||||
// Filter logic
|
||||
switch ($filter) {
|
||||
case 'current_month':
|
||||
$startDate = $currentMonth->copy()->startOfMonth();
|
||||
break;
|
||||
case '1_month':
|
||||
$startDate = $currentMonth->copy()->subMonth()->startOfMonth();
|
||||
break;
|
||||
case '2_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(2)->startOfMonth();
|
||||
break;
|
||||
case '3_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(3)->startOfMonth();
|
||||
break;
|
||||
case '6_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(6)->startOfMonth();
|
||||
break;
|
||||
default: // Default to 12 months
|
||||
$startDate = $currentMonth->copy()->subMonths(12)->startOfMonth();
|
||||
}
|
||||
|
||||
$endDate = $currentMonth->endOfMonth();
|
||||
|
||||
|
||||
$appointments = Appointment::with('patient')
|
||||
->whereBetween('created_at', [$startDate, $endDate])
|
||||
->get();
|
||||
|
||||
$totalSessions = $appointments->count();
|
||||
$totalCallTime = 10; // Assuming you have some logic to calculate this
|
||||
if ($totalSessions != 0) {
|
||||
$avgSessionTime = $totalCallTime / $totalSessions;
|
||||
$avgSessionTime = round(($avgSessionTime / 60), 2);
|
||||
} else
|
||||
$avgSessionTime = '';
|
||||
|
||||
|
||||
$monthlyData = [];
|
||||
|
||||
// Loop through each month in the last 12 months
|
||||
for ($date = $startDate->copy(); $date->lte($endDate); $date->addMonth()) {
|
||||
$monthStart = $date->startOfMonth()->format('Y-m-d');
|
||||
$monthEnd = $date->copy()->endOfMonth()->format('Y-m-d'); // Key change here!
|
||||
|
||||
$monthAppointments = Appointment::with('patient')
|
||||
->whereBetween('created_at', [$monthStart, $monthEnd])
|
||||
->get();
|
||||
|
||||
|
||||
// Calculate any metrics you need from $monthAppointments
|
||||
$monthlyData[] = [
|
||||
'month' => $date->format('M'), // Example: Jan 2024
|
||||
'appointment_count' => $monthAppointments->count()
|
||||
// Add other metrics as needed
|
||||
];
|
||||
}
|
||||
$monthsList = [];
|
||||
$monthlySessionCount = [];
|
||||
|
||||
foreach ($monthlyData as $dataPoint) {
|
||||
$monthsList[] = $dataPoint['month'];
|
||||
$monthlySessionCount[] = $dataPoint['appointment_count'];
|
||||
}
|
||||
|
||||
|
||||
return [
|
||||
// 'total_sessions' => $totalSessions,
|
||||
'total_call_time' => $totalCallTime,
|
||||
// 'avg_session_time' => $avgSessionTime,
|
||||
'data' => array_values($monthlySessionCount),
|
||||
'months_list' => $monthsList,
|
||||
];
|
||||
}
|
||||
public function getAdminDetails(Request $request)
|
||||
{
|
||||
$user = Auth::guard('admin')->user();
|
||||
$permissionManager = new Permissions($user->role->permissions);
|
||||
$permissions = $permissionManager->permissionsApi();
|
||||
if (isset($user->image_path))
|
||||
$user->image_path = $this->url->to('/storage/profile_pictures/' . $user->image_path);
|
||||
else
|
||||
$user->image_path = Null;
|
||||
return response()->json([
|
||||
'admin_details' => $user,
|
||||
'permissions'=>$permissions
|
||||
]);
|
||||
}
|
||||
public function updateAdminDetails(Request $request)
|
||||
{
|
||||
$userId = Auth::guard('admin')->user()->id;
|
||||
$user = Admin::find($userId);
|
||||
|
||||
if($request->get('image'))
|
||||
{
|
||||
$image = $request->get('image');
|
||||
$fileName = 'profile-' . time();
|
||||
|
||||
$logo = base64_decode($image);
|
||||
$ext = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[1]);
|
||||
|
||||
$imageName = $fileName . '.' . $ext;
|
||||
Storage::disk('local')->put("/public/profile_pictures/" . $imageName, $logo);
|
||||
}
|
||||
|
||||
$user->name = $request->get('first_name');
|
||||
$user->last_name = $request->get('last_name');
|
||||
$user->phone_no = $request->get('phone_no');
|
||||
if ($request->get('image'))
|
||||
$user->image_path = $imageName;
|
||||
$user->save();
|
||||
return response()->json([
|
||||
'admin_details' => $user
|
||||
]);
|
||||
}
|
||||
public function uploadImage($image, $fileName, $path)
|
||||
{
|
||||
$logo = base64_decode($image);
|
||||
$filename = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[0]);
|
||||
$ext = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[1]);
|
||||
$imageName = $fileName . '.' . $ext;
|
||||
$path = $path . $imageName;
|
||||
file_put_contents($path, $logo);
|
||||
return $imageName;
|
||||
}
|
||||
public function index(Request $request){
|
||||
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'DashboardData', new Admin);
|
||||
$start_date = $request->get('start_date');
|
||||
$end_date = $request->get('end_date');
|
||||
$totalPatients = $this->getTotals($start_date,$end_date);
|
||||
$graphData = $this->graphData($start_date,$end_date);
|
||||
$patientActivity = $this->patientActivit($start_date,$end_date);
|
||||
$ordersData = $this->ordersData($start_date,$end_date);
|
||||
$completedMeetings = $this->completedMeetings($start_date,$end_date);
|
||||
$orders = $this->productsData($start_date,$end_date);
|
||||
return response()->json([
|
||||
'totals' =>$totalPatients,
|
||||
'graph_data'=>$graphData,
|
||||
'patient_reg_activity'=>$patientActivity,
|
||||
'orders_data'=>$ordersData,
|
||||
'completed_meetings'=>$completedMeetings,
|
||||
'products'=>$orders
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function getTotals($start_date,$end_date)
|
||||
{
|
||||
$totalPatients = Patient::
|
||||
where('created_at', '>=', $start_date." 00:00:00")
|
||||
->where('created_at', '<=', $end_date." 23:59:59")
|
||||
->count();
|
||||
$totalOrders = Cart::select(
|
||||
DB::raw("count(carts.id) as total_sales"),
|
||||
DB::raw("sum(carts.total_amount ) as sales_amount"),
|
||||
DB::raw("count(items.id) as products_sold")
|
||||
)
|
||||
->leftJoin('items','items.cart_id','carts.id')
|
||||
->where('carts.created_at', '>=', $start_date." 00:00:00")
|
||||
->where('carts.created_at', '<=', $end_date." 23:59:59")
|
||||
->where('carts.status','completed')
|
||||
->first();
|
||||
|
||||
return [
|
||||
'total_patints'=>$totalPatients,
|
||||
'total_orders'=>$totalOrders->total_sales,
|
||||
'total_amount'=>$totalOrders->sales_amount,
|
||||
'total_products_sold'=>$totalOrders->products_sold
|
||||
];
|
||||
}
|
||||
public function graphData($start_date,$end_date)
|
||||
{
|
||||
$dates = [];
|
||||
$sales =[];
|
||||
$totalMeetingsData =[];
|
||||
$startDate = Carbon::parse($start_date);
|
||||
$endDate = Carbon::parse($end_date);
|
||||
for ($date = $startDate; $date->lte($endDate); $date->addDay()) {
|
||||
//get total sales data
|
||||
$values = Cart::select(
|
||||
DB::raw('DATE(created_at) as date'),
|
||||
DB::raw("SUM(case when carts.status = 'completed' then carts.total_amount else 0 end) as amount"))
|
||||
->where('carts.created_at', '>=', $date->format("Y-m-d")." 00:00:00")
|
||||
->where('carts.created_at', '<=', $date->format("Y-m-d")." 23:59:59")
|
||||
->groupBy(DB::raw('DATE(created_at)'));
|
||||
$graphsValues = $values->first();
|
||||
// get total meetings
|
||||
$totalMeetings = Appointment::
|
||||
where('start_time', '>=', $date->format("Y-m-d")." 00:00:00")
|
||||
->where('start_time', '<=', $date->format("Y-m-d")." 23:59:59")
|
||||
->where('status', 'completed')
|
||||
->count();
|
||||
$dates[] = $date->format("M d/y");
|
||||
if($graphsValues)
|
||||
$sales[] = round($graphsValues->amount,2);
|
||||
else
|
||||
$sales[] = 0.00;
|
||||
|
||||
$totalMeetingsData[] = round($totalMeetings,2);
|
||||
}
|
||||
return [
|
||||
'dates'=>$dates,
|
||||
'data'=>
|
||||
[
|
||||
'total_sales'=>$sales,
|
||||
'total_meetings'=>$totalMeetingsData
|
||||
]
|
||||
];
|
||||
}
|
||||
public function patientActivit($start_date,$end_date){
|
||||
$patientActivity = PatientRegActivity::
|
||||
where('created_at', '>=', $start_date." 00:00:00")
|
||||
->where('created_at', '<=', $end_date." 23:59:59")
|
||||
->get();
|
||||
|
||||
$activity = $patientActivity->map(function ($query,$key){
|
||||
$patient = Patient::find($query->patient_id);
|
||||
if($query->activity=='patient_registered')
|
||||
{
|
||||
$query->activity = $patient->first_name. " ". $patient->last_name. " Singed Up";
|
||||
}
|
||||
if($query->activity=='patient_appointment_booked')
|
||||
{
|
||||
$query->activity = $patient->first_name. " ". $patient->last_name. " Booked an appointment ";
|
||||
}
|
||||
return $query;
|
||||
|
||||
});
|
||||
|
||||
return $patientActivity;
|
||||
}
|
||||
public function ordersData($start_date,$end_date){
|
||||
return Cart::select('carts.id as order_id','carts.total_amount as amount',
|
||||
DB::raw("CONCAT(first_name,' ',last_name) as patient_name"),
|
||||
'created_at as date')
|
||||
->where('created_at', '>=', $start_date." 00:00:00")
|
||||
->where('created_at', '<=', $end_date." 23:59:59")
|
||||
->get();
|
||||
}
|
||||
public function completedMeetings($start_date,$end_date){
|
||||
return Appointment::select(
|
||||
'appointments.patient_id',
|
||||
'appointments.appointment_time',
|
||||
'appointments.appointment_date',
|
||||
'appointments.start_time',
|
||||
'appointments.end_time',
|
||||
'appointments.timezone',
|
||||
'telemed_pros.name as provider_name',
|
||||
'telemed_pros_id as provider_id',
|
||||
'carts.id as order_id',
|
||||
'appointments.patient_name'
|
||||
)
|
||||
->Join('telemed_pros', 'telemed_pros.id', 'appointments.telemed_pros_id')
|
||||
->Join("carts", "appointments.id","carts.appointment_id")
|
||||
->where('appointments.status', "completed")
|
||||
->where('appointments.end_time', '>=', $start_date." 00:00:00")
|
||||
->where('appointments.end_time', '<=', $end_date." 23:59:59")
|
||||
->get();
|
||||
}
|
||||
public function productsData($start_date,$end_date)
|
||||
{
|
||||
return Item::select(
|
||||
DB::raw("sum(case when items.status='delivered' then items.quantity else 0 end) as total_orders"),
|
||||
DB::raw("sum(case when items.status='delivered' then (items.quantity*plans_v1.price) else 0 end) as total_amount"),
|
||||
'plans_v1.title as product_name',
|
||||
'items.plans_id as product_id'
|
||||
)
|
||||
->leftJoin('plans_v1','plans_v1.id','items.plans_id')
|
||||
->where('items.created_at', '>=', $start_date." 00:00:00")
|
||||
->where('items.created_at', '<=', $end_date." 23:59:59")
|
||||
->groupby('plans_v1.title', 'items.plans_id')
|
||||
->get();
|
||||
// dd(Constant::getFullSql($products));
|
||||
}
|
||||
}
|
415
app/Http/Controllers/Admin/Api/HomeController.php
Normal file
415
app/Http/Controllers/Admin/Api/HomeController.php
Normal file
@@ -0,0 +1,415 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use Agence104\LiveKit\VideoGrant;
|
||||
use App\Classes\Constant;
|
||||
use App\Events\AppointmentBooked;
|
||||
use App\Events\PaymentProcessed;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Admin;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\Item;
|
||||
use App\Models\ItemHistory;
|
||||
use App\Models\Lab;
|
||||
use App\Models\LabKit;
|
||||
use App\Models\LabkitOrderItem;
|
||||
use App\Models\LicenseNumberModel;
|
||||
use App\Models\MedicalHistoryAnswer;
|
||||
use App\Models\Patient;
|
||||
use App\Models\PatientNote;
|
||||
use App\Models\PatientPlan;
|
||||
use App\Models\PatientPrescription;
|
||||
use App\Models\PatientRegActivity;
|
||||
use App\Models\Plan;
|
||||
use App\Models\PlanV1;
|
||||
use App\Models\Prescription;
|
||||
use App\Models\ProfileAnswer;
|
||||
use App\Models\ProfileCategory;
|
||||
use App\Models\QuestionBuilder;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Subscription;
|
||||
use App\Models\Telemedpro;
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonTimeZone;
|
||||
use DateTime;
|
||||
use DateTimeZone;
|
||||
use Error;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Agence104\LiveKit\AccessToken;
|
||||
use Agence104\LiveKit\AccessTokenOptions;
|
||||
use Agence104\LiveKit\RoomCreateOptions;
|
||||
use Agence104\LiveKit\RoomServiceClient;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
|
||||
class HomeController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function updateAdminProfile(Admin $admin, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'edit', new Admin);
|
||||
$admin->update($request->all());
|
||||
return response()->json([
|
||||
'message' => 'Admin updated successfully',
|
||||
'telemed' => $admin
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function product(PlanV1 $product)
|
||||
{
|
||||
return response()->json([
|
||||
'product' => $product
|
||||
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public function labsList()
|
||||
{
|
||||
$labs = Lab::all();
|
||||
return response()->json([
|
||||
'patients' => $labs
|
||||
]);
|
||||
}
|
||||
public function labs(Lab $lab)
|
||||
{
|
||||
return response()->json([
|
||||
'patient' => $lab
|
||||
]);
|
||||
}
|
||||
public function labsDelete(Lab $lab)
|
||||
{
|
||||
$lab->delete();
|
||||
return response()->json([
|
||||
'message' => "Deleted Successfully"
|
||||
]);
|
||||
}
|
||||
public function labsUpdate(Lab $lab, Request $request)
|
||||
{
|
||||
$lab->update($request->all());
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Lab updated successfully',
|
||||
'telemed' => $lab
|
||||
]);
|
||||
}
|
||||
|
||||
public function getQuestionBuilderStore(Patient $patient, Request $request)
|
||||
{
|
||||
|
||||
$questionBuilder = QuestionBuilder::select('key', 'value')->where("customer_id", $patient->id)->get();
|
||||
$jsonData = $questionBuilder->mapWithKeys(function ($item) {
|
||||
return [$item->key => $item->value];
|
||||
});
|
||||
// Store data
|
||||
return response()->json([
|
||||
'message' => 'Data Sent',
|
||||
'data' => $jsonData
|
||||
], 200);
|
||||
}
|
||||
public function getProducts()
|
||||
{
|
||||
return response()->json([
|
||||
'data' => PlanV1::select('plans_v1.*')->get()
|
||||
], 200);
|
||||
}
|
||||
public function storeOrderData(LabKit $labkit, Patient $patient, Request $request)
|
||||
{
|
||||
$user = $patient;
|
||||
$cart = new Cart();
|
||||
$cart->lab_kit_id = $labkit->id;
|
||||
$cart->first_name = $request->first_name;
|
||||
$cart->last_name = $request->last_name;
|
||||
/* $cart->appointment_id = $request->appointment_id; */
|
||||
$cart->email = $request->email;
|
||||
$cart->phone = $request->phone;
|
||||
$cart->status = "pending";
|
||||
$cart->prescription_status = "pending";
|
||||
|
||||
|
||||
|
||||
$cart->date_of_birth = $request->date_of_birth ?? null;
|
||||
|
||||
$cart->patient_id = $user->id;
|
||||
|
||||
$cart->shipping_address1 = $request->shipping_address1;
|
||||
$cart->shipping_address2 = $request->shipping_address2;
|
||||
$cart->shipping_city = $request->shipping_city;
|
||||
$cart->shipping_state = $request->shipping_state;
|
||||
$cart->shipping_zipcode = $request->shipping_zipcode;
|
||||
$cart->shipping_country = $request->shipping_country;
|
||||
|
||||
$cart->billing_address1 = $request->billing_address1;
|
||||
$cart->billing_address2 = $request->billing_address2;
|
||||
$cart->billing_city = $request->billing_city;
|
||||
$cart->billing_state = $request->billing_state;
|
||||
$cart->billing_zipcode = $request->billing_zipcode;
|
||||
$cart->billing_country = $request->billing_country;
|
||||
$cart->short_description = "Your order has been placed successfully";
|
||||
$cart->shipping_amount = $request->shipping_amount;
|
||||
$cart->total_amount = $request->total_amount;
|
||||
|
||||
$cart->save();
|
||||
|
||||
if ($request->has('items')) {
|
||||
foreach ($request->items as $itemData) {
|
||||
$item = new Item();
|
||||
$item->plans_id = $itemData['plans_id'];
|
||||
$item->quantity = $itemData['quantity'];
|
||||
|
||||
|
||||
$item->status = "pending";
|
||||
$item->labkit_delivery_status = "pending";
|
||||
$item->cart_id = $cart->id;
|
||||
$item->save();
|
||||
|
||||
$itemHistory = new ItemHistory();
|
||||
$itemHistory->note = "Order was placed (Order ID: #" . $cart->id . ")";
|
||||
$itemHistory->short_description = "Your order has been placed successfully";
|
||||
$itemHistory->cart_id = $cart->id;
|
||||
$itemHistory->status = "pending";
|
||||
$itemHistory->item_id = $item->id;
|
||||
if (isset($itemData['subscription']) && $itemData['subscription'] == true && $itemData['onetime'] == false) {
|
||||
$subscription = new Subscription();
|
||||
$subscription->subscription_start_date = Carbon::now();
|
||||
$subscription->subscription_renewal_date = Carbon::now()->addDays(30);
|
||||
$subscription->subscription_status = "Active";
|
||||
$subscription->cart_id = $cart->id;
|
||||
/* $subscription->status = "active"; */
|
||||
|
||||
$subscription->item_id = $item->id;
|
||||
$subscription->patient_id = $user->id;
|
||||
|
||||
$subscription->save();
|
||||
}
|
||||
|
||||
$itemHistory->save();
|
||||
|
||||
$plan = PlanV1::find($itemData['plans_id']);
|
||||
if ($plan->is_prescription_required == true)
|
||||
$labkitOrderItem = LabkitOrderItem::create([
|
||||
'cart_id' => $cart->id,
|
||||
'item_id' => $item->id,
|
||||
'lab_kit_id' => 1,
|
||||
/* 'result' => $request['result'], */
|
||||
'status' => "Ordered",
|
||||
]);
|
||||
}
|
||||
}
|
||||
return response()->json(['status' => 'Success', 'cart' => $cart], 200);
|
||||
}
|
||||
public function editOrderData(Cart $cart, Request $request)
|
||||
{
|
||||
// Validate the request data
|
||||
$validatedData = $request->validate([
|
||||
'first_name' => 'sometimes|string|max:255',
|
||||
'last_name' => 'sometimes|string|max:255',
|
||||
'email' => 'sometimes|email|max:255',
|
||||
'phone' => 'sometimes|string|max:20',
|
||||
'date_of_birth' => 'sometimes|date|nullable',
|
||||
'shipping_address1' => 'sometimes|string|max:255',
|
||||
'shipping_address2' => 'sometimes|string|max:255|nullable',
|
||||
'shipping_city' => 'sometimes|string|max:255',
|
||||
'shipping_state' => 'sometimes|string|max:255',
|
||||
'shipping_zipcode' => 'sometimes|string|max:20',
|
||||
'shipping_country' => 'sometimes|string|max:255',
|
||||
'patient_id' => 'sometimes',
|
||||
/* 'billing_address1' => 'sometimes|string|max:255',
|
||||
'billing_address2' => 'sometimes|string|max:255|nullable',
|
||||
'billing_city' => 'sometimes|string|max:255',
|
||||
'billing_state' => 'sometimes|string|max:255',
|
||||
'billing_zipcode' => 'sometimes|string|max:20',
|
||||
'billing_country' => 'sometimes|string|max:255', */
|
||||
'shipping_amount' => 'sometimes|numeric',
|
||||
'total_amount' => 'sometimes|numeric',
|
||||
'items' => 'sometimes|array',
|
||||
/* 'items.*.plans_id' => 'required_with:items|exists:plans,id',
|
||||
'items.*.quantity' => 'required_with:items|integer|min:1',
|
||||
'items.*.subscription' => 'sometimes|boolean',
|
||||
'items.*.onetime' => 'sometimes|boolean', */
|
||||
]);
|
||||
|
||||
// Update the cart with validated data
|
||||
$cart->fill($validatedData);
|
||||
$cart->save();
|
||||
|
||||
// Update or create items
|
||||
if ($request->has('items')) {
|
||||
foreach ($request->items as $itemData) {
|
||||
$item = Item::updateOrCreate(
|
||||
['cart_id' => $cart->id, 'plans_id' => $itemData['plans_id']],
|
||||
[
|
||||
'quantity' => $itemData['quantity'],
|
||||
'status' => 'pending',
|
||||
'labkit_delivery_status' => 'pending',
|
||||
]
|
||||
);
|
||||
|
||||
// Update or create subscription
|
||||
if (isset($itemData['subscription']) && $itemData['subscription'] == true && $itemData['onetime'] == false) {
|
||||
Subscription::updateOrCreate(
|
||||
['cart_id' => $cart->id, 'item_id' => $item->id],
|
||||
[
|
||||
'subscription_start_date' => $item->created_at,
|
||||
'subscription_renewal_date' => $item->created_at->addDays(30),
|
||||
'subscription_status' => 'Active',
|
||||
'patient_id' => $cart->patient_id,
|
||||
]
|
||||
);
|
||||
} else {
|
||||
// Remove subscription if it exists and is no longer needed
|
||||
Subscription::where('cart_id', $cart->id)
|
||||
->where('item_id', $item->id)
|
||||
->delete();
|
||||
}
|
||||
|
||||
// Update or create LabkitOrderItem
|
||||
$plan = PlanV1::find($itemData['plans_id']);
|
||||
if ($plan->is_prescription_required) {
|
||||
LabkitOrderItem::updateOrCreate(
|
||||
['cart_id' => $cart->id, 'item_id' => $item->id],
|
||||
[
|
||||
'lab_kit_id' => 1,
|
||||
'status' => 'Ordered',
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove items that are no longer in the request
|
||||
/* if ($request->has('items')) {
|
||||
$currentItemIds = collect($request->items)->pluck('plans_id')->toArray();
|
||||
ItemHistory::where('cart_id', $cart->id)
|
||||
//->whereNotIn('plans_id', $currentItemIds)
|
||||
->delete();
|
||||
Item::where('cart_id', $cart->id)
|
||||
->whereNotIn('plans_id', $currentItemIds)
|
||||
->delete();
|
||||
} */
|
||||
|
||||
// Refresh the cart to get the updated data
|
||||
$cart->refresh();
|
||||
|
||||
return response()->json(['status' => 'Success', 'cart' => $cart], 200);
|
||||
}
|
||||
|
||||
|
||||
public function getPrescription()
|
||||
{
|
||||
$prescriptions = Prescription::query();
|
||||
|
||||
return DataTables::of($prescriptions)->make(true);
|
||||
}
|
||||
public function processPayment(Patient $patient, Request $request)
|
||||
{
|
||||
//event(new PaymentProcessed($patient));
|
||||
return response()->json(['status' => 'Success'], 200);
|
||||
}
|
||||
|
||||
|
||||
public function questionBuilderStore(Patient $patient, $category, Request $request)
|
||||
{
|
||||
$data = $request->all();
|
||||
|
||||
$questionBuilderData = [];
|
||||
$category = ProfileCategory::where("category_link", $category)->first();
|
||||
if (!$category)
|
||||
return response()->json([
|
||||
'message' => 'Invalid Category Link',
|
||||
'data' => ''
|
||||
], 200);
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
if (is_array($value)) {
|
||||
$value = serialize($value);
|
||||
}
|
||||
if (!empty($value)) {
|
||||
$questionBuilderData[] = [
|
||||
'key' => $key,
|
||||
'value' => $value,
|
||||
'profile_category_id' => $category->id,
|
||||
'customer_id' => $patient->id
|
||||
];
|
||||
}
|
||||
}
|
||||
// dd($questionBuilderData);
|
||||
$questionBuilder = QuestionBuilder::insert($questionBuilderData);
|
||||
|
||||
$questionBuilder = QuestionBuilder::select('key', 'value')->get();
|
||||
|
||||
// Convert the data to a key-value JSON format
|
||||
$jsonData = $questionBuilder->mapWithKeys(function ($item) {
|
||||
return [$item->key => $item->value];
|
||||
});
|
||||
// Store data+
|
||||
return response()->json([
|
||||
'message' => 'Data Inserted',
|
||||
'data' => $jsonData
|
||||
], 200);
|
||||
}
|
||||
public function getMedicalHistoryQuestion(Patient $patient, Request $request)
|
||||
{
|
||||
$answers = MedicalHistoryAnswer::where('patient_id', $patient->id)->get();
|
||||
|
||||
return response()->json([
|
||||
'status' => 'Success',
|
||||
'answers' => $answers
|
||||
], 200);
|
||||
}
|
||||
public function postMedicalHistoryQuestion(Patient $patient, Request $request)
|
||||
{
|
||||
|
||||
foreach ($request->answers as $answer) {
|
||||
$existing = MedicalHistoryAnswer::where("patient_id", $patient->id)->where('question_key', $answer['question_key'])->first();
|
||||
|
||||
if ($existing) {
|
||||
$existing->answer = $answer['answer'];
|
||||
$existing->patient_id = $patient->id;
|
||||
$existing->type = $answer['type'];
|
||||
$existing->save();
|
||||
} else {
|
||||
$newAnswer = new MedicalHistoryAnswer();
|
||||
$newAnswer->question_key = $answer['question_key'];
|
||||
$newAnswer->patient_id = $patient->id;
|
||||
$newAnswer->answer = $answer['answer'];
|
||||
$newAnswer->type = $answer['type'];
|
||||
$newAnswer->save();
|
||||
}
|
||||
}
|
||||
|
||||
PatientRegActivity::create([
|
||||
'patient_id' => $patient->id,
|
||||
'activity' => 'patient_medical_question_entered'
|
||||
]);
|
||||
|
||||
return response()->json(['status' => 'Success'], 200);
|
||||
}
|
||||
}
|
66
app/Http/Controllers/Admin/Api/LoginController.php
Normal file
66
app/Http/Controllers/Admin/Api/LoginController.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Tymon\JWTAuth\Facades\JWTAuth;
|
||||
use App\Models\Admin;
|
||||
use App\Permissions\Permissions;
|
||||
|
||||
class LoginController extends Controller
|
||||
{
|
||||
public function loginApi(Request $request)
|
||||
{
|
||||
$credentials = $request->only('email', 'password');
|
||||
|
||||
// Validate the request
|
||||
$validator = Validator::make($credentials, [
|
||||
'email' => 'required|email',
|
||||
'password' => 'required|string',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json($validator->errors(), 422);
|
||||
}
|
||||
|
||||
// Find the user by email
|
||||
$admin = Admin::where('email', $credentials['email'])->first();
|
||||
|
||||
if (!$admin || !Auth::guard('admin')->validate($credentials)) {
|
||||
return response()->json(['error' => 'Invalid email or password'], 401);
|
||||
}
|
||||
|
||||
// Gen$admin->role;erate the JWT token
|
||||
$token = JWTAuth::fromUser($admin);
|
||||
$permissionManager = new Permissions($admin->role->permissions);
|
||||
$permissions = $permissionManager->permissionsApi();
|
||||
|
||||
// Construct user data
|
||||
$userData = [
|
||||
'id' => $admin->id,
|
||||
'fullName' => $admin->name, // Assuming 'name' field contains the full name
|
||||
'username' => $admin->username, // Assuming you have a 'username' field
|
||||
'avatar' => '/images/avatars/avatar-1.png', // Static for example; replace with dynamic if available
|
||||
'email' => $admin->email,
|
||||
'role' => strtolower($admin->role->role_name), // Assuming the role is 'admin',
|
||||
|
||||
];
|
||||
// Construct the response
|
||||
return response()->json([
|
||||
'userAbilityRules' => [
|
||||
[
|
||||
'action' => 'manage',
|
||||
'subject' =>'all'
|
||||
]
|
||||
],
|
||||
'accessToken' => $token,
|
||||
'userData' => $userData,
|
||||
'permissions'=>$permissions
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
}
|
240
app/Http/Controllers/Admin/Api/MedicineController.php
Normal file
240
app/Http/Controllers/Admin/Api/MedicineController.php
Normal file
@@ -0,0 +1,240 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\Lab;
|
||||
use App\Models\LabKit;
|
||||
use App\Models\MedicalHistoryAnswer;
|
||||
use App\Models\Patient;
|
||||
use App\Models\PatientPrescription;
|
||||
use App\Models\PatientRegActivity;
|
||||
use App\Models\Plan;
|
||||
use App\Models\PlanV1;
|
||||
use App\Models\ProfileAnswer;
|
||||
use App\Models\QuestionBuilder;
|
||||
use App\Models\Telemedpro;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\URL;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
|
||||
class MedicineController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function getMedList()
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'list', new PlanV1);
|
||||
$medicines = PlanV1::query();
|
||||
return Datatables::of($medicines)
|
||||
->addColumn('image_url', function ($med) {
|
||||
return URL::to("product/" . $med->image_url);
|
||||
})
|
||||
->toJson();
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function SaveMed(Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'add', new PlanV1);
|
||||
$slug = self::createSlug($request->get('slug'));
|
||||
if ($request->get('image')) {
|
||||
//upload website logo
|
||||
$fileName = $slug;
|
||||
$filePath = public_path() . '/product/';
|
||||
$fileName = $this->uploadImage($request->get('image'), $fileName, $filePath);
|
||||
////////////////
|
||||
}
|
||||
|
||||
PlanV1::create([
|
||||
'title' => $request->get('title'),
|
||||
'currency' => $request->get('currency'),
|
||||
'price' => $request->get('price'),
|
||||
'list_one_title' => $request->get('list_one_title'),
|
||||
'list_two_title' => $request->get('list_two_title'),
|
||||
'list_sub_title' => $request->get('list_sub_title'),
|
||||
'image_url' => $fileName,
|
||||
'slug' => $slug,
|
||||
'domain' => $request->get('domain'),
|
||||
'product_file_path' => null
|
||||
]);
|
||||
return response()->json([
|
||||
'message' => "success"
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function uploadImage($image, $fileName, $path)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new PlanV1);
|
||||
$logo = base64_decode($image);
|
||||
$filename = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[0]);
|
||||
$ext = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[1]);
|
||||
$imageName = $fileName . '.' . $ext;
|
||||
$path = $path . $imageName;
|
||||
file_put_contents($path, $logo);
|
||||
return $imageName;
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function EditMed($id, Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new PlanV1);
|
||||
$medicine = PlanV1::find($id);
|
||||
$slug = self::createSlug($request->get('slug'));
|
||||
$fileName = null;
|
||||
if ($request->get('image')) {
|
||||
//upload website logo
|
||||
$fileName = $slug;
|
||||
$filePath = public_path() . '/product/';
|
||||
$fileName = $this->uploadImage($request->get('image'), $fileName, $filePath);
|
||||
////////////////
|
||||
}
|
||||
$medicine->title = $request->get('title');
|
||||
$medicine->currency = $request->get('currency');
|
||||
$medicine->price = $request->get('price');
|
||||
$medicine->list_one_title = $request->get('list_one_title');
|
||||
$medicine->list_two_title = $request->get('list_two_title');
|
||||
$medicine->list_sub_title = $request->get('list_sub_title');
|
||||
$medicine->image_url = $fileName;
|
||||
$medicine->slug = $slug;
|
||||
$medicine->domain = $request->get('domain');
|
||||
$medicine->save();
|
||||
return response()->json([
|
||||
'message' => "success"
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function DeleteMed($id, Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new PlanV1);
|
||||
$medicine = PlanV1::where("id", $id)->delete();
|
||||
return response()->json([
|
||||
'message' => "success"
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
private function createSlug($string)
|
||||
{
|
||||
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
|
||||
|
||||
return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
|
||||
}
|
||||
private function storeFile($file, $destinationPath)
|
||||
{
|
||||
//Display File Name
|
||||
$file->getClientOriginalName();
|
||||
$file->getClientOriginalExtension();
|
||||
$file->getRealPath();
|
||||
$file->getSize();
|
||||
$file->getMimeType();
|
||||
//Move Uploaded File
|
||||
|
||||
$file->move($destinationPath, $file->getClientOriginalName() . '.' . $file->getClientOriginalExtension());
|
||||
}
|
||||
public function getFileList()
|
||||
{
|
||||
$files = PlanV1::select('product_file_path')->groupBy('product_file_path')->get();
|
||||
return response()->json([
|
||||
'medicines' => $files
|
||||
]);
|
||||
}
|
||||
public function updateStatusPatientPrescription(PatientPrescription $PatientPrescription, Request $request)
|
||||
{
|
||||
$PatientPrescription->status = $request->input("status");
|
||||
$PatientPrescription->save();
|
||||
return response()->json([
|
||||
'status' => 'updated to ' . $request->input("status")
|
||||
]);
|
||||
}
|
||||
public function updateStatusLabkit(Cart $cart, Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new LabKit);
|
||||
$cart->status = $request->input("status");
|
||||
$cart->save();
|
||||
return response()->json([
|
||||
'status' => 'updated to ' . $request->input("status")
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function labkitList()
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new LabKit);
|
||||
$labkit = LabKit::all();
|
||||
return response()->json([
|
||||
'labkit' => $labkit
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function labsKitDelete(LabKit $labkit)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'delete', new LabKit);
|
||||
$labkit->delete();
|
||||
return response()->json([
|
||||
'message' => "Deleted Successfully"
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function labskitUpdate(LabKit $labkit, Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new LabKit);
|
||||
$labkit->update($request->all());
|
||||
return response()->json([
|
||||
'message' => 'Labkit updated successfully',
|
||||
'telemed' => $labkit
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function labskitCreate(LabKit $labkit, Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'add', new LabKit);
|
||||
$labkit->create($request->all());
|
||||
return response()->json([
|
||||
'message' => 'Labkit created successfully',
|
||||
'telemed' => $labkit
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function getPatientLabKitOrders(Patient $patient, Request $request)
|
||||
{
|
||||
$cart = Cart::with("patient")->where("patient_id", $patient->id)->get();
|
||||
return response()->json(['cart' => $cart], 200);
|
||||
}
|
||||
}
|
538
app/Http/Controllers/Admin/Api/OrderController.php
Normal file
538
app/Http/Controllers/Admin/Api/OrderController.php
Normal file
@@ -0,0 +1,538 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Classes\Constant;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\Item;
|
||||
use App\Models\ItemHistory;
|
||||
use App\Models\LabkitOrderItem;
|
||||
use App\Models\Patient;
|
||||
use App\Models\PatientNote;
|
||||
use App\Models\PatientPrescription;
|
||||
use App\Models\Payment;
|
||||
use App\Models\Permission;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Subscription;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Contracts\Routing\UrlGenerator;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
class OrderController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function orderList(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'view', new Cart);
|
||||
$fromDate = $request->get('from_date');
|
||||
$toDate = $request->get('to_date');
|
||||
$status = $request->get('status');
|
||||
$orderList = Cart::select(
|
||||
"appointments.*",
|
||||
'appointments.id as appointment_id',
|
||||
'carts.*',
|
||||
'carts.id as order_id',
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name) as patient_name")
|
||||
)
|
||||
->leftJoin('appointments', 'appointments.id', 'carts.appointment_id');
|
||||
|
||||
|
||||
if ($fromDate != "all") {
|
||||
$from_date = Carbon::createFromFormat('m-d-Y', $fromDate)->format('Y-m-d');
|
||||
$orderList->where('carts.created_at', ">=", $from_date . " 00:00:00");
|
||||
}
|
||||
if ($toDate != "all") {
|
||||
$to_date = Carbon::createFromFormat('m-d-Y', $toDate)->format('Y-m-d');
|
||||
$orderList->where('carts.created_at', "<=", $to_date . " 23:59:59");
|
||||
}
|
||||
if ($status != "all") {
|
||||
$orderList->where('carts.status', $status);
|
||||
}
|
||||
// dd(Constant::getFullSql($orderList));
|
||||
return Datatables::of($orderList)
|
||||
->addColumn('order_total_amount', function ($order) {
|
||||
$items = Item::where('cart_id', $order->id)->get();
|
||||
return $items->sum(function ($item) {
|
||||
return $item->quantity * $item->price;
|
||||
});
|
||||
})
|
||||
->addColumn('order_total_shipping', function ($order) {
|
||||
$items = Item::where('cart_id', $order->id)->get();
|
||||
return $items->sum('shipping_cost');
|
||||
})
|
||||
->addColumn('appointment_status', function ($order) {
|
||||
$appointment = Appointment::find($order->appointment_id);
|
||||
return $appointment ? $appointment->status : 'null';
|
||||
})
|
||||
->addColumn('total_items', function ($order) {
|
||||
return Item::where('cart_id', $order->id)->sum('quantity');
|
||||
})
|
||||
->addColumn('order_items', function ($order) {
|
||||
$items = Item::with('plansV1')
|
||||
->where('cart_id', $order->id)
|
||||
->get()
|
||||
->map(function ($item) {
|
||||
$planV1 = $item->plansV1;
|
||||
if ($planV1) {
|
||||
$planV1->qty = $item->quantity;
|
||||
$planV1->status = $item->status;
|
||||
}
|
||||
return $planV1;
|
||||
});
|
||||
return $items;
|
||||
})
|
||||
->make(true);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function orderListbyPatient(Patient $patient, Request $request)
|
||||
{
|
||||
|
||||
$fromDate = $request->get('from_date');
|
||||
$toDate = $request->get('to_date');
|
||||
$orderList = Cart::where('carts.patient_id', $patient->id);
|
||||
if ($fromDate != "") {
|
||||
$from_date = Carbon::createFromFormat('m-d-Y', $fromDate)->format('Y-m-d');
|
||||
$orderList->where('created_at', ">=", $from_date . " 00:00:00");
|
||||
}
|
||||
if ($toDate != "") {
|
||||
$to_date = Carbon::createFromFormat('m-d-Y', $toDate)->format('Y-m-d');
|
||||
$orderList->where('created_at', "<=", $to_date . " 23:59:59");
|
||||
}
|
||||
|
||||
$orderListData = $orderList->get();
|
||||
$totalPrice = 0;
|
||||
$totalShippingCost = 0;
|
||||
foreach ($orderListData as $order) {
|
||||
$totalPrice = 0;
|
||||
$total_products = 0;
|
||||
$quantity = [];
|
||||
$totalShippingCost = 0;
|
||||
$order->order_total_amount = $totalPrice;
|
||||
$order->order_total_shipping = $totalShippingCost;
|
||||
$items = Item::leftJoin('plans_v1', 'items.plans_id', 'plans_v1.id')
|
||||
->where('cart_id', $order->id)
|
||||
->get();
|
||||
//$order->appointment_status = Appointment::where('id', $order->appointment_id)->first()->status;
|
||||
|
||||
$orderItems = [];
|
||||
foreach ($items as $item) {
|
||||
array_push($orderItems, $item->plansV1);
|
||||
$totalShippingCost += $item->shipping_cost;
|
||||
$item->total_price = $item->quantity * $item->price;
|
||||
$totalPrice += $item->total_price;
|
||||
$order->order_total_amount = $totalPrice;
|
||||
$order->order_total_shipping = $totalShippingCost;
|
||||
$item->plansV1->qty = $item->quantity;
|
||||
}
|
||||
|
||||
$order->total_items = $total_products;
|
||||
$order->order_items = $orderItems;
|
||||
}
|
||||
return response()
|
||||
->json([
|
||||
'order_data' => $orderListData
|
||||
]);
|
||||
}
|
||||
public function orderDetails($id)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'details', new Cart);
|
||||
|
||||
$orderItems = $this->getOrderItems($id);
|
||||
$orderDetails = Cart::find($id);
|
||||
$items = Item::where('cart_id', $orderDetails->id)->get();
|
||||
$appointments = Appointment::select(
|
||||
'appointments.*',
|
||||
'telemed_pros.name as provider_name',
|
||||
'telemed_pros.email as provider_email',
|
||||
'telemed_pros.phone_number as provider_phone',
|
||||
'carts.total_amount',
|
||||
'carts.shipping_amount'
|
||||
)
|
||||
->leftJoin('telemed_pros', 'telemed_pros.id', 'appointments.telemed_pros_id')
|
||||
->leftJoin('carts', 'carts.appointment_id', 'appointments.id')
|
||||
|
||||
->where('appointments.id', $orderDetails->appointment_id)
|
||||
->first();
|
||||
if (Gate::forUser($this->user)->allows('prescriptions', new Cart)) {
|
||||
$prescription = PatientPrescription::select(
|
||||
'patient_prescription.id as patient_prescription_id',
|
||||
'patient_prescription.id',
|
||||
'patient_prescription.created_by_id',
|
||||
'patient_prescription.created_by_type',
|
||||
'patient_prescription.direction_quantity',
|
||||
'patient_prescription.refill_quantity',
|
||||
'patient_prescription.dosage',
|
||||
'patient_prescription.status',
|
||||
'patient_prescription.direction_one',
|
||||
'patient_prescription.direction_two',
|
||||
'patient_prescription.dont_substitute',
|
||||
'patient_prescription.comments',
|
||||
'patient_prescription.brand',
|
||||
'patient_prescription.from',
|
||||
'patient_prescription.quantity',
|
||||
'patient_prescription.created_at as prescription_date',
|
||||
'prescriptions.name as prescription_name',
|
||||
'patient_prescription.prescription_id',
|
||||
'telemed_pros.name as provide_name',
|
||||
'telemed_pros.id as provider_id',
|
||||
)
|
||||
->where("appointment_id", $orderDetails->appointment_id)
|
||||
->leftJoin('appointments', 'appointments.id', 'patient_prescription.appointment_id')
|
||||
->leftJoin('prescriptions', 'prescriptions.id', 'patient_prescription.prescription_id')
|
||||
->leftJoin('telemed_pros', 'appointments.telemed_pros_id', 'telemed_pros.id')
|
||||
->get();
|
||||
} else {
|
||||
$prescription = ['error' => "Access Denied!"];
|
||||
}
|
||||
if (Gate::forUser($this->user)->allows('detail_notes', new Cart)) {
|
||||
$patientNotes = PatientNote::where("appointment_id", $orderDetails->appointment_id)->get();
|
||||
} else {
|
||||
$patientNotes = ['error' => "Access Denied!"];
|
||||
}
|
||||
|
||||
if ($appointments)
|
||||
$appointments->provider_id = $appointments->telemed_pros_id;
|
||||
$patient = $orderDetails->patient;
|
||||
$patient->profile_picture = $this->url->to("storage/profile_pictures/" . $patient->profile_picture);
|
||||
|
||||
return response()
|
||||
->json([
|
||||
'order_details' => $orderDetails,
|
||||
'order_items' => $orderItems,
|
||||
'patient_details' => $patient,
|
||||
'appointment_details' => $appointments,
|
||||
'items_activity' => $this->getShippingActivity($id),
|
||||
'appointment_notes' => $patientNotes,
|
||||
'prescription' => $prescription
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function getOrderItems($id)
|
||||
{
|
||||
$items = Item::select('plans_v1.*', 'items.*', 'items.id as item_id', 'plans_v1.id as plans_id')
|
||||
->leftJoin('plans_v1', 'items.plans_id', 'plans_v1.id')
|
||||
->where('cart_id', $id)
|
||||
->get();
|
||||
|
||||
$totalPrice = 0;
|
||||
$totalShippingCost = 0;
|
||||
$total_products = 0;
|
||||
|
||||
$itemsWithFlags = $items->map(function ($item) {
|
||||
$subscription = Subscription::where('item_id', $item->item_id)->first();
|
||||
|
||||
$item->subscription = $subscription ? true : false;
|
||||
$item->onetime = $subscription ? true : false;
|
||||
|
||||
$item->total_price = $item->quantity * $item->price;
|
||||
$item->image_url = $this->url->to("product/" . $item->image_url);
|
||||
|
||||
return $item;
|
||||
});
|
||||
|
||||
foreach ($itemsWithFlags as $item) {
|
||||
$totalShippingCost += $item->shipping_cost;
|
||||
$totalPrice += $item->total_price;
|
||||
$total_products += $item->quantity;
|
||||
}
|
||||
|
||||
return [
|
||||
'items' => $itemsWithFlags,
|
||||
'total_amount' => $totalPrice,
|
||||
'total_shipping_cost' => $totalShippingCost,
|
||||
'total_products' => $total_products,
|
||||
'total' => $totalPrice + $totalShippingCost
|
||||
];
|
||||
}
|
||||
public function getShippingActivity($id)
|
||||
{
|
||||
$itemsHistory = ItemHistory::select('items_history.*', 'plans_v1.title as item_name')
|
||||
->where('items_history.cart_id', $id)
|
||||
->leftJoin('items', 'items.id', 'items_history.item_id')
|
||||
->leftJoin('plans_v1', 'plans_v1.id', 'items.plans_id')
|
||||
->get();
|
||||
return $itemsHistory;
|
||||
}
|
||||
public function getPaymentDetail($id)
|
||||
{
|
||||
|
||||
$orderDetails = Cart::find($id);
|
||||
$payment = Payment::where('order_id', $orderDetails->id)->first();
|
||||
|
||||
return response()
|
||||
->json([
|
||||
'payment' => $payment
|
||||
]);
|
||||
}
|
||||
public function labkitOrderItemGet(Request $request)
|
||||
{
|
||||
$labkitOrderItems = LabkitOrderItem::where('labkit_order_items.cart_id', $request->input('cart_id'))
|
||||
->leftJoin(
|
||||
'lab_kit',
|
||||
'labkit_order_items.lab_kit_id',
|
||||
'=',
|
||||
'lab_kit.id'
|
||||
)
|
||||
->leftJoin(
|
||||
'items',
|
||||
'items.id',
|
||||
'labkit_order_items.item_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'plans_v1',
|
||||
'plans_v1.id',
|
||||
'items.plans_id'
|
||||
)
|
||||
->select(
|
||||
'labkit_order_items.id',
|
||||
'labkit_order_items.status',
|
||||
'labkit_order_items.result',
|
||||
'lab_kit.name as lab_kit_name',
|
||||
'plans_v1.title as item_name'
|
||||
)
|
||||
->get();
|
||||
foreach ($labkitOrderItems as $labKit) {
|
||||
|
||||
if ($labKit->result != "")
|
||||
$labKit->result = $this->url->to('storage/lab_results/' . $labKit->result);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'data' => $labkitOrderItems,
|
||||
]);
|
||||
}
|
||||
public function orderCount(Request $request)
|
||||
{
|
||||
|
||||
$fromDate = $request->get('from_date');
|
||||
$toDate = $request->get('to_date');
|
||||
$total_order = Cart::select(
|
||||
"appointments.*",
|
||||
'appointments.id as appointment_id',
|
||||
'carts.*',
|
||||
'carts.id as order_id',
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name) as patient_name"),
|
||||
)->leftJoin('appointments', 'appointments.id', 'carts.appointment_id');
|
||||
$total_order = $total_order->count();
|
||||
|
||||
$total_appointment_order = Cart::select(
|
||||
"appointments.*",
|
||||
'appointments.id as appointment_id',
|
||||
'carts.*',
|
||||
'carts.id as order_id',
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name) as patient_name"),
|
||||
)->join('appointments', 'appointments.id', 'carts.appointment_id')
|
||||
->whereNotNull("appointments.id");
|
||||
$total_appointment_order = $total_appointment_order->count();
|
||||
|
||||
$total_appointment_order_without = Cart::select(
|
||||
"appointments.*",
|
||||
'appointments.id as appointment_id',
|
||||
'carts.*',
|
||||
'carts.id as order_id',
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name) as patient_name"),
|
||||
)->leftJoin('appointments', 'appointments.id', 'carts.appointment_id')
|
||||
->whereNull("appointments.id");
|
||||
$total_appointment_order_without = $total_appointment_order_without->count();
|
||||
|
||||
$upcomingMeetings = Cart::select(
|
||||
'carts.id as order_id',
|
||||
'appointments.id',
|
||||
'appointments.patient_id',
|
||||
'appointments.appointment_time',
|
||||
'appointments.appointment_date',
|
||||
DB::raw(
|
||||
'CONCAT(patients.first_name, " " , patients.last_name) as patient_name'
|
||||
)
|
||||
)
|
||||
->join('appointments', 'appointments.id', 'carts.appointment_id')
|
||||
->leftJoin('patients', 'patients.id', 'appointments.patient_id')
|
||||
->where('appointments.appointment_date', ">=", Carbon::now()->format("Y-m-d"))
|
||||
->where('appointments.start_time', null)
|
||||
->count();
|
||||
|
||||
$completedMeetings = Cart::select(
|
||||
'carts.id as order_id',
|
||||
'appointments.patient_id',
|
||||
'appointments.appointment_time',
|
||||
'appointments.appointment_date',
|
||||
'appointments.start_time',
|
||||
'appointments.end_time',
|
||||
'telemed_pros.name as provider_name',
|
||||
'appointments.telemed_pros_id as provider_id',
|
||||
|
||||
DB::raw(
|
||||
'CONCAT(patients.first_name, " " , patients.last_name) as patient_name'
|
||||
)
|
||||
)
|
||||
->join('appointments', 'appointments.id', 'carts.appointment_id')
|
||||
->leftJoin('patients', 'patients.id', 'appointments.patient_id')
|
||||
->leftJoin('telemed_pros', 'telemed_pros.id', 'appointments.telemed_pros_id')
|
||||
->where('appointments.start_time', "!=", null)
|
||||
->where('appointments.end_time', "!=", null)
|
||||
->count();
|
||||
|
||||
|
||||
$prescribeOrderList = Cart::select(
|
||||
"appointments.*",
|
||||
'appointments.id as appointment_id',
|
||||
'carts.*',
|
||||
'carts.id as order_id',
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name) as patient_name"),
|
||||
)
|
||||
->leftJoin('appointments', 'appointments.id', 'carts.appointment_id');
|
||||
|
||||
|
||||
$prescribeOrderCount = $prescribeOrderList->where("prescription_status", 1)->count();
|
||||
return response()
|
||||
->json([
|
||||
'total_appointment_order' => $total_appointment_order,
|
||||
'total_order' => $total_order,
|
||||
'total_appointment_order_without' => $total_appointment_order_without,
|
||||
'upcomingMeetings' => $upcomingMeetings,
|
||||
'completedMeetings' => $completedMeetings,
|
||||
'prescribeOrderCount' => $prescribeOrderCount,
|
||||
]);
|
||||
}
|
||||
public function updateItemStatus($id, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'edit', new Cart);
|
||||
Item::where('id', $id)
|
||||
->update([
|
||||
'status' => $request->get('status')
|
||||
]);
|
||||
$itemsCount = Item::where('cart_id', $request->get('order_id'));
|
||||
$statusNeeded = $itemsCount->where('status', '!=', 'pending')
|
||||
->where('status', '!=', 'canceled')
|
||||
->where('status', '!=', 'failed')
|
||||
->where('status', '!=', 'refunded')
|
||||
->where('status', '!=', 'processing')
|
||||
->count();
|
||||
|
||||
if ($itemsCount->count() == $statusNeeded) {
|
||||
Cart::where('id', $request->get('order_id'))->update([
|
||||
'status' => 'completed'
|
||||
]);
|
||||
}
|
||||
return response()
|
||||
->json([
|
||||
'success' => "Updated !"
|
||||
], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function addNotePatient(Cart $cart, Request $request)
|
||||
{
|
||||
|
||||
//$user = Auth::user();
|
||||
$appointment = Appointment::find($cart->appointment_id);
|
||||
$addNotePatient = PatientNote::create([
|
||||
'note' => $request->input('note'),
|
||||
'note_type' => $request->input('note_type'),
|
||||
'patient_id' => $cart->patient_id,
|
||||
'appointment_id' => $cart->appointment_id,
|
||||
'telemed_pros_id' => $appointment->telemed_pros_id ?? null,
|
||||
'admin_id' => Auth::guard('admin')->user()->id
|
||||
|
||||
]);
|
||||
$addNotePatient->file_url = "";
|
||||
if ($request->hasFile('file')) {
|
||||
$file = $request->file('file');
|
||||
|
||||
$filename = $addNotePatient->id . '.' . $file->getClientOriginalExtension();
|
||||
|
||||
$file->move(public_path('assets/files'), $filename);
|
||||
|
||||
$addNotePatient->file_url = "assets/files" . $addNotePatient->id . '.' . $file->getClientOriginalExtension();
|
||||
}
|
||||
$patient = $addNotePatient->patient;
|
||||
$setting = Setting::find(1);
|
||||
/* Mail::send('emails.noteAdded', ['patient' => $patient, 'agent' => $user, 'setting' => $setting], function ($message) use ($patient, $user) {
|
||||
$message->to($patient->email, $patient->first_name)
|
||||
->subject('You Have a New Note from ' . $user->name);
|
||||
}); */
|
||||
return response()->json([
|
||||
'message' => 'Note created',
|
||||
'data' => $addNotePatient
|
||||
], 200);
|
||||
}
|
||||
public function editNotePatient($id, Request $request)
|
||||
{
|
||||
$note = PatientNote::findOrFail($id);
|
||||
$note->update([
|
||||
'note' => $request->input('note'),
|
||||
'note_type' => $request->input('note_type'),
|
||||
'admin_id' => Auth::guard('admin')->user()->id
|
||||
]);
|
||||
|
||||
if ($request->hasFile('file')) {
|
||||
// Delete old file if it exists
|
||||
if ($note->file_url) {
|
||||
$oldFilePath = public_path($note->file_url);
|
||||
if (file_exists($oldFilePath)) {
|
||||
unlink($oldFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
$file = $request->file('file');
|
||||
$filename = $note->id . '.' . $file->getClientOriginalExtension();
|
||||
$file->move(public_path('assets/files'), $filename);
|
||||
$note->file_url = "assets/files" . $note->id . '.' . $file->getClientOriginalExtension();
|
||||
$note->save();
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Note updated',
|
||||
'data' => $note
|
||||
], 200);
|
||||
}
|
||||
|
||||
public function deleteNotePatient($id)
|
||||
{
|
||||
$note = PatientNote::findOrFail($id);
|
||||
|
||||
// Delete associated file if it exists
|
||||
if ($note->file_url) {
|
||||
$filePath = public_path($note->file_url);
|
||||
if (file_exists($filePath)) {
|
||||
unlink($filePath);
|
||||
}
|
||||
}
|
||||
|
||||
$note->delete();
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Note deleted'
|
||||
], 200);
|
||||
}
|
||||
public function getNotePatient($id)
|
||||
{
|
||||
$note = PatientNote::with(['admin'])->findOrFail($id);
|
||||
|
||||
return response()->json([
|
||||
'note' => $note
|
||||
], 200);
|
||||
}
|
||||
}
|
550
app/Http/Controllers/Admin/Api/PatientController.php
Normal file
550
app/Http/Controllers/Admin/Api/PatientController.php
Normal file
@@ -0,0 +1,550 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Classes\Constant;
|
||||
use App\Events\PatientRegistered;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\Item;
|
||||
use App\Models\ItemHistory;
|
||||
use App\Models\LabkitOrderItem;
|
||||
use App\Models\Patient;
|
||||
use App\Models\PatientNote;
|
||||
use App\Models\PatientPrescription;
|
||||
use App\Models\PatientRegActivity;
|
||||
use App\Models\Setting;
|
||||
use Carbon\Carbon;
|
||||
use DateTime;
|
||||
use Illuminate\Contracts\Routing\UrlGenerator;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
|
||||
use Agence104\LiveKit\VideoGrant;
|
||||
use App\Events\AppointmentBooked;
|
||||
use App\Events\PaymentProcessed;
|
||||
use App\Models\Admin;
|
||||
use App\Models\Lab;
|
||||
use App\Models\LabKit;
|
||||
use App\Models\LicenseNumberModel;
|
||||
use App\Models\MedicalHistoryAnswer;
|
||||
use App\Models\PatientPlan;
|
||||
use App\Models\Plan;
|
||||
use App\Models\PlanV1;
|
||||
use App\Models\Prescription;
|
||||
use App\Models\ProfileAnswer;
|
||||
use App\Models\ProfileCategory;
|
||||
use App\Models\QuestionBuilder;
|
||||
use App\Models\Subscription;
|
||||
use App\Models\Telemedpro;
|
||||
use Carbon\CarbonTimeZone;
|
||||
use DateTimeZone;
|
||||
use Error;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Agence104\LiveKit\AccessToken;
|
||||
use Agence104\LiveKit\AccessTokenOptions;
|
||||
use Agence104\LiveKit\RoomCreateOptions;
|
||||
use Agence104\LiveKit\RoomServiceClient;
|
||||
|
||||
class PatientController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function newPatient(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'add', new Patient);
|
||||
$validatedData = $request->validate([
|
||||
'first_name' => 'required|string|max:255',
|
||||
'last_name' => 'required|string|max:255',
|
||||
'email' => 'required|string|email|max:255|unique:patients',
|
||||
'password' => 'required',
|
||||
'dob' => 'required|date_format:Y-m-d',
|
||||
'phone_no' => 'required'
|
||||
]);
|
||||
$patient = Patient::create([
|
||||
'first_name' => $request->input('first_name'),
|
||||
'last_name' => $request->input('last_name'),
|
||||
'phone_no' => $request->input('phone_no'),
|
||||
'email' => $request->input('email'),
|
||||
'password' => Hash::make($request->input('password')),
|
||||
'dob' => $request->input('dob'),
|
||||
'gender' => $request->input('gender') ?? "",
|
||||
]);
|
||||
|
||||
$patient->address = $request->input('address');
|
||||
$patient->state = $request->input('state');
|
||||
$patient->city = $request->input('city');
|
||||
$patient->country = $request->input('country');
|
||||
|
||||
$patient->zip_code = $request->input('zip');
|
||||
|
||||
$patient->shipping_address = $request->input('address');
|
||||
$patient->shipping_state = $request->input('state');
|
||||
$patient->shipping_city = $request->input('city');
|
||||
$patient->shipping_zipcode = $request->input('zip');
|
||||
|
||||
|
||||
$image = $request->get('profile_pic');
|
||||
$fileName = 'profile-' . time();
|
||||
|
||||
$logo = base64_decode($image);
|
||||
$ext = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[1]);
|
||||
|
||||
$imageName = $fileName . '.' . $ext;
|
||||
Storage::disk('local')->put("public/profile_pictures/" . $imageName, $logo);
|
||||
$patient->profile_picture = $imageName;
|
||||
$patient->save();
|
||||
|
||||
|
||||
if ($patient->dob) {
|
||||
$birthDate = new DateTime($patient->dob);
|
||||
$today = new DateTime(date('Y-m-d'));
|
||||
$age = $today->diff($birthDate)->y;
|
||||
$patient->age = $age;
|
||||
} else {
|
||||
$patient->age = 0;
|
||||
}
|
||||
PatientRegActivity::create([
|
||||
'patient_id' => $patient->id,
|
||||
'activity' => 'patient_registered'
|
||||
]);
|
||||
$setting = Setting::find(1);
|
||||
event(new PatientRegistered($patient, $validatedData));
|
||||
return response()
|
||||
->json([
|
||||
'data' => $patient
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function patientShippingAddress($id, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'edit', new Patient);
|
||||
$patient = Patient::find($id);
|
||||
$patient->shipping_address = $request->input('address');
|
||||
$patient->shipping_state = $request->input('state');
|
||||
$patient->shipping_city = $request->input('city');
|
||||
$patient->shipping_zipcode = $request->input('zip');
|
||||
$patient->save();
|
||||
return response()
|
||||
->json([
|
||||
'data' => $patient
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function patientList(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Patient);
|
||||
$patients = Patient::query();
|
||||
|
||||
// Filter by state
|
||||
if ($request->input('state') != "all") {
|
||||
$patients->where('patients.state', $request->input('state'));
|
||||
}
|
||||
|
||||
// Filter by gender
|
||||
if ($request->input('gender') != "all") {
|
||||
$patients->where('patients.gender', $request->input('gender'));
|
||||
}
|
||||
|
||||
// Filter by plan (assuming you have a plan field or relation)
|
||||
if ($request->input('plan') != "all") {
|
||||
$planNames = $request->input('plan');
|
||||
|
||||
$patients->leftJoin('patient_plan', 'patients.id', '=', 'patient_plan.patient_id')
|
||||
->leftJoin('plans_v1', 'patient_plan.plan_id', '=', 'plans_v1.id')
|
||||
->where('plans_v1.slug', $planNames);
|
||||
}
|
||||
|
||||
// Join with the carts table to get order details
|
||||
$patients->leftJoin('carts', 'patients.id', '=', 'carts.patient_id')
|
||||
->select('patients.*')
|
||||
->addSelect([
|
||||
'last_order_date' => Cart::selectRaw('MAX(created_at)')
|
||||
->whereColumn('patient_id', 'patients.id'),
|
||||
'total_orders' => Cart::selectRaw('COUNT(*)')
|
||||
->whereColumn('patient_id', 'patients.id'),
|
||||
'total_subscriptions' => Cart::selectRaw('COUNT(DISTINCT start_subscription)')
|
||||
->whereColumn('patient_id', 'patients.id'),
|
||||
]);
|
||||
|
||||
Log::info('PatientList Datatable:', [
|
||||
'sql' => $patients->toSql(),
|
||||
'bindings' => $patients->getBindings()
|
||||
]);
|
||||
|
||||
// Use DataTables to process the query
|
||||
return DataTables::of($patients)->make(true);
|
||||
} catch (\Exception | Error $e) {
|
||||
// Log the error
|
||||
Log::error('Error in patientList: ' . $e->getMessage());
|
||||
// Return an error response
|
||||
return response()->json([
|
||||
'error' => 'An error occurred while processing the request.',
|
||||
'message' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
public function patientFullDetail(Patient $patient)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'edit', new Patient);
|
||||
$patient->first_name = $patient->first_name . " " . $patient->last_name;
|
||||
$plans = PatientPlan::join('plans_v1', 'patient_plan.plan_id', '=', 'plans_v1.id')
|
||||
->leftJoin('medication_categories', 'plans_v1.medication_category_id', '=', 'medication_categories.id')
|
||||
->where('patient_plan.patient_id', $patient->id)
|
||||
->select('plans_v1.*', 'medication_categories.category_name')
|
||||
->orderBy('plans_v1.created_at', 'desc')
|
||||
->first();
|
||||
$upcomingMeetings = Appointment::select(
|
||||
'appointments.patient_id',
|
||||
'appointments.timezone',
|
||||
'appointments.appointment_time',
|
||||
'appointments.appointment_date',
|
||||
'carts.id as order_id'
|
||||
)
|
||||
->leftJoin("carts", "carts.appointment_id", "appointments.id")
|
||||
->where("appointments.patient_id", $patient->id)
|
||||
// dd(Constant::getFullSql($upcomingMeetings));
|
||||
->get();
|
||||
$completedMeetings = Appointment::select(
|
||||
'appointments.patient_id',
|
||||
'appointments.appointment_time',
|
||||
'appointments.appointment_date',
|
||||
'appointments.start_time',
|
||||
'appointments.end_time',
|
||||
'appointments.timezone',
|
||||
'telemed_pros.name as provider_name',
|
||||
'telemed_pros_id as provider_id',
|
||||
'carts.id as order_id'
|
||||
)
|
||||
->leftJoin('telemed_pros', 'telemed_pros.id', 'appointments.telemed_pros_id')
|
||||
->leftJoin("carts", "carts.appointment_id", "appointments.id")
|
||||
->where("appointments.patient_id", $patient->id)
|
||||
->where('appointments.start_time', "!=", null)
|
||||
->where('appointments.end_time', "!=", null)
|
||||
->get();
|
||||
$patientNotes = PatientNote::select(
|
||||
'patient_notes.id',
|
||||
'patient_notes.note',
|
||||
'patient_notes.note_type',
|
||||
'telemed_pros.name as provider_name',
|
||||
'telemed_pros.id as provider_id',
|
||||
'patient_notes.created_at',
|
||||
'patient_notes.patient_id',
|
||||
'carts.id as order_id',
|
||||
'patient_notes.created_by_id',
|
||||
'patient_notes.created_by_type'
|
||||
)
|
||||
->leftJoin('telemed_pros', 'patient_notes.telemed_pros_id', 'telemed_pros.id')
|
||||
->leftJoin("carts", "carts.appointment_id", "patient_notes.appointment_id")
|
||||
->where("patient_notes.patient_id", $patient->id)
|
||||
->get();
|
||||
|
||||
foreach ($patientNotes as $notes) {
|
||||
if ($notes->note_type != 'Notes')
|
||||
$notes->note = $this->url->to("assets/files/" . $notes->patient_id . ".png");
|
||||
else
|
||||
$notes->note = $notes->note;
|
||||
}
|
||||
$patientPrescription = PatientPrescription::select(
|
||||
'patient_prescription.*',
|
||||
'telemed_pros.name as provider_name',
|
||||
'prescriptions.*',
|
||||
'carts.id as order_id'
|
||||
)
|
||||
->leftJoin('appointments', 'patient_prescription.appointment_id', 'appointments.id')
|
||||
->leftJoin("carts", "carts.appointment_id", "appointments.id")
|
||||
->leftJoin('telemed_pros', 'appointments.telemed_pros_id', 'telemed_pros.id')
|
||||
->leftJoin('prescriptions', 'prescriptions.id', 'patient_prescription.prescription_id')
|
||||
->where('patient_prescription.patient_id', $patient->id)->get();
|
||||
$patient->profile_completion_Percentage = $patient->profile_completion_Percentage;
|
||||
$labkits = LabkitOrderItem::leftJoin(
|
||||
'lab_kit',
|
||||
'labkit_order_items.lab_kit_id',
|
||||
'lab_kit.id'
|
||||
)
|
||||
->leftJoin(
|
||||
'items',
|
||||
'items.id',
|
||||
'labkit_order_items.item_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'plans_v1',
|
||||
'plans_v1.id',
|
||||
'items.plans_id'
|
||||
)
|
||||
->leftJoin(
|
||||
'carts',
|
||||
'carts.id',
|
||||
'labkit_order_items.cart_id'
|
||||
)
|
||||
->where('carts.patient_id', $patient->id)
|
||||
->select(
|
||||
'labkit_order_items.id',
|
||||
'labkit_order_items.status',
|
||||
'labkit_order_items.result',
|
||||
'lab_kit.name as lab_kit_name',
|
||||
'plans_v1.id as product_id',
|
||||
'plans_v1.title as product_name'
|
||||
)
|
||||
->get();
|
||||
$orderList = Cart::select("appointments.*", 'appointments.id as appointment_id', 'carts.*', 'carts.id as order_id', 'telemed_pros.name as agent_name', 'telemed_pros.email as agent_email')
|
||||
->leftJoin('appointments', 'appointments.id', 'carts.appointment_id')
|
||||
->leftJoin('telemed_pros', 'appointments.telemed_pros_id', '=', 'telemed_pros.id')
|
||||
->where('appointments.patient_id', $patient->id);
|
||||
|
||||
$orderListData = $orderList->get();
|
||||
return response()->json([
|
||||
'patient' => $patient,
|
||||
'plans' => $plans,
|
||||
'upcomingMeetings' => $upcomingMeetings,
|
||||
'completed_meetings' => $completedMeetings,
|
||||
'patientNotes' => $patientNotes,
|
||||
'prescriptionData' => $patientPrescription,
|
||||
'labkit' => $labkits,
|
||||
'orderListData' => $orderListData,
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function patientDelete(Patient $patient)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'delete', new Patient);
|
||||
Patient::where("id", $patient->id)->delete();
|
||||
return response()->json([
|
||||
'patient' => "Deleted Successfully"
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function patientUpdate(Patient $patient, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'edit', new Patient);
|
||||
$patient->first_name = $request->input('first_name');
|
||||
$patient->last_name = $request->input('last_name');
|
||||
$patient->phone_no = $request->input('phone_no');
|
||||
$patient->shipping_address = $request->input('gender');
|
||||
$patient->shipping_address = $request->input('dob');
|
||||
if ($request->input('password')) {
|
||||
$patient->password = Hash::make($request->input('password'));
|
||||
}
|
||||
$patient->shipping_address = $request->input('address');
|
||||
$patient->shipping_state = $request->input('state');
|
||||
$patient->shipping_city = $request->input('city');
|
||||
$patient->shipping_zipcode = $request->input('zip');
|
||||
$patient->shipping_country = $request->input('country');
|
||||
|
||||
$patient->save();
|
||||
return response()->json([
|
||||
'message' => 'Patient updated successfully',
|
||||
'telemed' => $patient
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function getNotePatient(Patient $patient, Appointment $appointment, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'patient_notes', new Patient);
|
||||
$patientNotes = PatientNote::where("patient_id", $patient->id)
|
||||
->where("appointment_id", $appointment->id)
|
||||
->with('appointment')
|
||||
->get();
|
||||
|
||||
$data = $patientNotes->map(function ($patientNote) {
|
||||
$fileUrl = "/assets/files/{$patientNote->id}.png";
|
||||
$filePath = public_path($fileUrl);
|
||||
|
||||
if (File::exists($filePath)) {
|
||||
$fileUrl = "/assets/files/{$patientNote->id}.png";
|
||||
} else {
|
||||
$fileUrl = null;
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $patientNote->id,
|
||||
'note' => $patientNote->note,
|
||||
'note_type' => $patientNote->note_type,
|
||||
'created_at' => $patientNote->created_at,
|
||||
'patient_id' => $patientNote->patient_id,
|
||||
'appointment' => $patientNote->appointment,
|
||||
'telemedPro' => $patientNote->telemedPro,
|
||||
'file_url' => $fileUrl,
|
||||
'telemedPro' => $patientNote->appointment?->telemedPro
|
||||
];
|
||||
});
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Patient notes retrieved',
|
||||
'data' => $data
|
||||
], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function patient(Patient $patient)
|
||||
{
|
||||
return response()->json([
|
||||
'data' => $patient
|
||||
], 200);
|
||||
}
|
||||
public function getPatientPrescription($patient_id, $appointment_id)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'patinet_prescriptions', new Patient);
|
||||
$patientPrescription = PatientPrescription::with('prescription')
|
||||
->where('patient_id', $patient_id)
|
||||
->where('appointment_id', $appointment_id)
|
||||
->get();
|
||||
|
||||
$prescriptionData = [];
|
||||
foreach ($patientPrescription as $prescription) {
|
||||
$prescriptionData[] = [
|
||||
'patient' => $prescription->patient,
|
||||
'prescription' => $prescription->prescription,
|
||||
'created_at' => $prescription->created_at,
|
||||
'updated_at' => $prescription->updated_at,
|
||||
'direction_one' => $prescription->direction_one,
|
||||
'direction_two' => $prescription->direction_two,
|
||||
'dont_substitute' => $prescription->dont_substitute,
|
||||
'comments' => $prescription->comments,
|
||||
'appointment_id' => $prescription->appointment_id,
|
||||
'status' => $prescription->status,
|
||||
'appointment' => $prescription->appointment,
|
||||
'telemedPro' => $prescription->appointment->telemedPro,
|
||||
'licenseNumber' => LicenseNumberModel::where("provider_id", $patient_id)->orderBy('id', 'DESC')->first()
|
||||
];
|
||||
}
|
||||
if (!$patientPrescription->isEmpty()) {
|
||||
return response()->json($prescriptionData);
|
||||
} else {
|
||||
return response()->json(['message' => 'Prescription not found'], 404);
|
||||
}
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function storePatientPrescription(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'patinet_prescriptions', new Patient);
|
||||
$cart = Cart::find($request->input("order_id"));
|
||||
$prescription = PatientPrescription::create($request->all());
|
||||
$prescription->appointment_id = $cart->appointment_id;
|
||||
$prescription->status = "pending";
|
||||
$prescription->save();
|
||||
$patient = $prescription->patient;
|
||||
$setting = Setting::find(1);
|
||||
/* Mail::send('emails.prescriptionAdd', ['patient' => $patient, 'prescription' => $prescription, 'setting' => $setting], function ($message) use ($patient, $user) {
|
||||
$message->to($patient->email, $patient->first_name)
|
||||
->subject('New Prescription Details from ' . $user->name);
|
||||
}); */
|
||||
return response()->json($prescription, 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function updateStatusPrescription($patient_prescription_id, Request $request)
|
||||
{
|
||||
//
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'patinet_prescriptions_edit', new Patient);
|
||||
$status = $request->input("status");
|
||||
$prescription = PatientPrescription::find($patient_prescription_id);
|
||||
$prescription->status = $status;
|
||||
$prescription->save();
|
||||
$patient = $prescription->patient;
|
||||
$setting = Setting::find(1);
|
||||
/* Mail::send('emails.prescriptionUpdated', ['patient' => $patient, 'setting' => $setting], function ($message) use ($patient) {
|
||||
$message->to($patient->email, $patient->first_name)
|
||||
->subject('Prescription updated.');
|
||||
}); */
|
||||
return response()->json($prescription, 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function getStatusPrescription($patient_prescription_id)
|
||||
{
|
||||
$prescription = PatientPrescription::with(['prescription'])
|
||||
->findOrFail($patient_prescription_id);
|
||||
return response()->json($prescription, 200);
|
||||
}
|
||||
public function updatePatientPrescription($id, Request $request)
|
||||
{
|
||||
try {
|
||||
$prescription = PatientPrescription::findOrFail($id);
|
||||
$prescription->update($request->all());
|
||||
|
||||
if ($request->has('status')) {
|
||||
$prescription->status = $request->input('status');
|
||||
}
|
||||
|
||||
$prescription->save();
|
||||
|
||||
$patient = $prescription->patient;
|
||||
$setting = Setting::find(1);
|
||||
|
||||
// You might want to add email notification here if needed
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Prescription updated successfully',
|
||||
'data' => $prescription
|
||||
], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'message' => 'An error occurred while updating the prescription',
|
||||
'error' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
public function deletePatientPrescription($id)
|
||||
{
|
||||
try {
|
||||
$prescription = PatientPrescription::findOrFail($id);
|
||||
$prescription->delete();
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Prescription deleted successfully'
|
||||
], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'message' => 'An error occurred while deleting the prescription',
|
||||
'error' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
}
|
126
app/Http/Controllers/Admin/Api/PermissionsController.php
Normal file
126
app/Http/Controllers/Admin/Api/PermissionsController.php
Normal file
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Permission;
|
||||
use App\Permissions\Permissions;
|
||||
use Illuminate\Http\Request;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Rels;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
use Illuminate\Contracts\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
class PermissionsController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'list', new Permission);
|
||||
$roleList = Permission::all();
|
||||
return Datatables::of($roleList)
|
||||
->toJson();
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
|
||||
}
|
||||
public function storeRole(Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'add', new Permission);
|
||||
Permission::create(
|
||||
[
|
||||
'role_name' => $request->input('role_name'),
|
||||
'role_guard' => $request->input('role_guard')
|
||||
]
|
||||
);
|
||||
return response()->json([
|
||||
'success' => 'Data Saved!'
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function editRoles($id)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new Permission);
|
||||
return response()->json([
|
||||
'data' => Permission::find($id)
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function updateRoles($id,Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new Permission);
|
||||
$permission = Permission::find($id);
|
||||
$permission->role_name = $request->input('role_name');
|
||||
$permission->role_guard = $request->input('role_guard');
|
||||
$permission->save();
|
||||
return response()->json([
|
||||
'data' => Permission::find($id)
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function deleteRoles($id){
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'delete', new Permission);
|
||||
Permission::find($id)->delete();
|
||||
return response()->json([
|
||||
'success' => 'role Deleted Successfully !'
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function updatePermissions($id,Request $request)
|
||||
{
|
||||
$permission = Permission::find($id);
|
||||
}
|
||||
public function getPermissions($id)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'list', new Permission);
|
||||
$role = Permission::find($id);
|
||||
$rolePermissions = $role->permissions;
|
||||
$permissionManager = new Permissions($rolePermissions);
|
||||
$permissions = $permissionManager->getPermissions();
|
||||
// $permissions = $permissionManager->permissionsApi();
|
||||
return response()->json([
|
||||
'data' => $permissions
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function savePermissions($id,Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new Permission);
|
||||
// $permissions = 'DASHBOARD_,DASHBOARD_FILTERS,DASHBOARD_DATA,PRODUCT_,PRODUCT_VIEW,PRODUCT_ADD,PRODUCT_EDIT,PRODUCT_DELETE,PROVIDER_,PROVIDER_VIEW,PROVIDER_ADD,PROVIDER_EDIT,PROVIDER_DELETE,ADMIN_,ADMIN_VIEW,ADMIN_ADD,ADMIN_EDIT,ADMIN_DELETE,ADMIN_SITE_SETTINGS,ADMIN_SECURITY';
|
||||
$permissions = $request->input('permisssions');
|
||||
$permissionsArray = explode(',',$permissions);
|
||||
|
||||
$permissionsData = Permission::find($id);
|
||||
$permissionsData->permissions = $permissionsArray;
|
||||
$permissionsData->save();
|
||||
return response()->json([
|
||||
'success' => "permissions saved !"
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
97
app/Http/Controllers/Admin/Api/PrescriptionController.php
Normal file
97
app/Http/Controllers/Admin/Api/PrescriptionController.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Classes\Constant;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Prescription;
|
||||
use Illuminate\Contracts\Routing\UrlGenerator;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
class PrescriptionController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function index(){}
|
||||
public function create(Request $request){
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'add', new Prescription);
|
||||
$data = [
|
||||
'name'=>$request->input('name'),
|
||||
'brand'=>$request->input('brand'),
|
||||
'from'=>$request->input('from'),
|
||||
'dosage'=>$request->input('dosage'),
|
||||
'quantity'=>$request->input('quantity'),
|
||||
'direction_quantity'=>$request->input('direction_quantity'),
|
||||
'refill_quantity'=>$request->input('refill_quantity')
|
||||
];
|
||||
Prescription::create($data);
|
||||
return response()
|
||||
->json([
|
||||
'success' => "Data Saved !"
|
||||
], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function update($id,Request $request){
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new Prescription);
|
||||
$prescription = $this->details($id);
|
||||
$prescription->name =$request->input('name');
|
||||
$prescription->brand =$request->input('brand');
|
||||
$prescription->from = $request->input('from');
|
||||
$prescription->dosage = $request->input('dosage');
|
||||
$prescription->quantity = $request->input('quantity');
|
||||
$prescription->direction_quantity = $request->input('direction_quantity');
|
||||
$prescription->refill_quantity = $request->input('refill_quantity');
|
||||
$prescription->save();
|
||||
return response()
|
||||
->json([
|
||||
'success' => "Data Updated !"
|
||||
], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function details($id){
|
||||
try{
|
||||
// $this->authorizeForUser($this->user,'view', new Prescription);
|
||||
return Prescription::find($id);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function edit($id)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new Prescription);
|
||||
return response()
|
||||
->json([
|
||||
'data' => $this->details($id)
|
||||
], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function delete($id)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'delete', new Prescription);
|
||||
Prescription::find($id)->delete();
|
||||
return response()
|
||||
->json([
|
||||
'success' => "Entry Deleted !"
|
||||
], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
584
app/Http/Controllers/Admin/Api/ReportsController.php
Normal file
584
app/Http/Controllers/Admin/Api/ReportsController.php
Normal file
@@ -0,0 +1,584 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Classes\Constant;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Admin;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\Item;
|
||||
use App\Models\ItemHistory;
|
||||
use App\Models\LabkitOrderItem;
|
||||
use App\Models\LicenseNumberModel;
|
||||
use App\Models\Patient;
|
||||
use App\Models\PatientNote;
|
||||
use App\Models\PatientPrescription;
|
||||
use App\Models\ProfileQuestion;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Telemedpro;
|
||||
use DateInterval;
|
||||
use DatePeriod;
|
||||
use DateTime;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use PhpParser\Node\Stmt\Const_;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
|
||||
class ReportsController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function providerReportFilters()
|
||||
{
|
||||
$providers = Telemedpro::select(
|
||||
DB::raw("CONCAT(license_numbers.license_number,',',license_numbers.state) as provider_license_number"),
|
||||
'appointments.patient_name',
|
||||
'appointments.appointment_date',
|
||||
'appointments.appointment_time',
|
||||
'appointments.timezone',
|
||||
'start_time',
|
||||
'end_time',
|
||||
'duration',
|
||||
DB::raw("CONCAT(patients.first_name,',',patients.last_name) as patient_name"),
|
||||
'patients.phone_no',
|
||||
'patients.email',
|
||||
'patients.address',
|
||||
'patients.city',
|
||||
'patients.state',
|
||||
'patients.zip_code',
|
||||
'patients.country',
|
||||
'patients.gender',
|
||||
'patients.dob',
|
||||
'patients.height',
|
||||
'patients.weight'
|
||||
)
|
||||
->LeftJoin('license_numbers', 'provider_id', 'telemed_pros.id')
|
||||
->LeftJoin('appointments', 'appointments.telemed_pros_id', 'telemed_pros.id')
|
||||
->leftJoin('patients', 'appointments.patient_id', 'patients.id')
|
||||
->whereNotNull('appointments.start_time')
|
||||
->whereNotNull('appointments.end_time')
|
||||
->get();
|
||||
|
||||
foreach ($providers as $provider) {
|
||||
$start_datetime = new DateTime($provider->start_time);
|
||||
$diff = $start_datetime->diff(new DateTime($provider->end_time));
|
||||
$duration = $diff->h . " hours " . $diff->i . " Min";
|
||||
// dd($providers->duration,$duration);
|
||||
$provider->duration = $duration;
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'provider_list' => $providers,
|
||||
]);
|
||||
}
|
||||
public function providerReportPost(Request $request)
|
||||
{
|
||||
return response()->json([
|
||||
'provider_list' => ''
|
||||
]);
|
||||
}
|
||||
public function overviewReport(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'overview_analytics', new ProfileQuestion);
|
||||
$start_date = $request->get('start_date');
|
||||
$end_date = $request->get('end_date');
|
||||
$totalOrdersStats = Cart::select(
|
||||
DB::raw("sum(case when carts.status = 'completed' then 1 else 0 end) as total_sales"),
|
||||
DB::raw("sum(case when carts.status = 'completed' then carts.total_amount else 0 end) as sales_amount"),
|
||||
DB::raw("count(items.id) as products_sold")
|
||||
)
|
||||
->Join('items', 'items.cart_id', 'carts.id')
|
||||
->where('carts.created_at', '>=', $start_date . " 00:00:00")
|
||||
->where('carts.created_at', '<=', $end_date . " 23:59:59")
|
||||
->where('carts.status', '=', 'completed')
|
||||
->get();
|
||||
$orderCollection = Cart::select(
|
||||
'carts.id as order_id',
|
||||
'carts.status',
|
||||
'carts.email',
|
||||
'carts.total_amount',
|
||||
'carts.created_at as date',
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name) as patient_name")
|
||||
)
|
||||
->where('carts.created_at', '>=', $start_date . " 00:00:00")
|
||||
->where('carts.created_at', '<=', $end_date . " 23:59:59")
|
||||
->where('carts.status', '=', 'completed')
|
||||
->get();
|
||||
$orderData = $orderCollection->map(function ($query, $key) {
|
||||
$patientType = $query->where('email', $query->email)->count();
|
||||
$itemSold = Item::select(DB::raw("GROUP_CONCAT(title SEPARATOR ', ') as items"))
|
||||
->where('cart_id', $query->order_id)
|
||||
->leftJoin('plans_v1', 'items.plans_id', 'plans_v1.id');
|
||||
$itemCount = $itemSold->count();
|
||||
$products = $itemSold->first();
|
||||
if ($patientType > 1)
|
||||
$query->customer_type = 'returning';
|
||||
else
|
||||
$query->customer_type = 'new';
|
||||
|
||||
$query->products = $products->items ?? null;
|
||||
$query->item_sold = $itemCount ?? 0;
|
||||
|
||||
$query->attribution = 'direct';
|
||||
|
||||
return $query;
|
||||
});
|
||||
$dates = [];
|
||||
$sales = [];
|
||||
$startDate = Carbon::parse($start_date);
|
||||
$endDate = Carbon::parse($end_date);
|
||||
for ($date = $startDate; $date->lte($endDate); $date->addDay()) {
|
||||
$values = Cart::select(
|
||||
DB::raw('DATE(created_at) as date'),
|
||||
DB::raw("SUM(case when carts.status = 'completed' then carts.total_amount else 0 end) as amount")
|
||||
)
|
||||
->where('carts.created_at', '>=', $date->format("Y-m-d") . " 00:00:00")
|
||||
->where('carts.created_at', '<=', $date->format("Y-m-d") . " 23:59:59")
|
||||
->groupBy(DB::raw('DATE(created_at)'));
|
||||
$graphsValues = $values->first();
|
||||
|
||||
$dates[] = $date->format("M d/y");
|
||||
if ($graphsValues)
|
||||
$sales[] = $graphsValues->amount;
|
||||
else
|
||||
$sales[] = 0;
|
||||
}
|
||||
$newUser = 0;
|
||||
$returnUser = 0;
|
||||
$newUsers = [];
|
||||
$returningUsers = [];
|
||||
//getting here unique rows for patient stats
|
||||
$uniqueKeys = array_map(function ($item) {
|
||||
return $item['email'];
|
||||
}, $orderCollection->toArray());
|
||||
|
||||
$uniqueRecords = array_intersect_key($orderCollection->toArray(), array_unique($uniqueKeys));
|
||||
$uniqueRecords = array_values($uniqueRecords);
|
||||
|
||||
foreach ($orderCollection as $userStats) {
|
||||
$userStatus = Cart::where('email', $userStats->email)->count();
|
||||
if ($userStatus > 1) {
|
||||
$returnUser++;
|
||||
$returningUsers[] = $userStats;
|
||||
} else {
|
||||
$newUser++;
|
||||
$newUsers[] = $userStats;
|
||||
}
|
||||
};
|
||||
|
||||
$percentageReturning = 0;
|
||||
$percentageNewuser = 0;
|
||||
if ($returnUser > 0 || $newUser > 0) {
|
||||
$percentageReturning = ($returnUser / ($returnUser + $newUser)) * 100;
|
||||
$percentageNewuser = ($newUser / ($returnUser + $newUser)) * 100;
|
||||
}
|
||||
|
||||
//check here users engagement
|
||||
|
||||
$newUserEngagement = $this->calculateEngagement($newUsers);
|
||||
$returningUserEngagement = $this->calculateEngagement($returningUsers);
|
||||
return response()->json([
|
||||
'totals' => $totalOrdersStats,
|
||||
'orders' => $orderData,
|
||||
'chart' => [
|
||||
'chart_dates' => $dates,
|
||||
'chart_data' => $sales
|
||||
],
|
||||
'patient_stats' =>
|
||||
[
|
||||
'returning_users' => [$returnUser, round($percentageReturning, 0) . "%"],
|
||||
'new_users' => [$newUser, round($percentageNewuser, 0) . "%"]
|
||||
]
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function ordersFilters()
|
||||
{
|
||||
$patient = Patient::select('id', DB::raw("CONCAT(first_name,' ',last_name) as patient_name"))->get();
|
||||
return response()->json([
|
||||
'patients' => $patient
|
||||
|
||||
]);
|
||||
}
|
||||
public function initialPatients()
|
||||
{
|
||||
$patients = Patient::select('id', DB::raw("CONCAT(first_name,' ',last_name) as patient_name"))
|
||||
->limit(100)
|
||||
->orderBy('patient_name', 'asc')
|
||||
->get();
|
||||
|
||||
return response()->json([
|
||||
'patients' => $patients
|
||||
]);
|
||||
}
|
||||
|
||||
public function searchPatients(Request $request)
|
||||
{
|
||||
$searchTerm = $request->input('term');
|
||||
|
||||
$patients = Patient::select('id', DB::raw("CONCAT(first_name,' ',last_name) as patient_name"))
|
||||
->where(DB::raw("CONCAT(first_name,' ',last_name)"), 'LIKE', "%{$searchTerm}%")
|
||||
->limit(500)
|
||||
->orderBy('patient_name', 'asc')
|
||||
->get();
|
||||
|
||||
return response()->json([
|
||||
'patients' => $patients
|
||||
]);
|
||||
}
|
||||
|
||||
// Function to calculate engagement metrics
|
||||
function calculateEngagement($users)
|
||||
{
|
||||
$totalUsers = count($users);
|
||||
$completedOrders = 0;
|
||||
$totalAmount = 0;
|
||||
|
||||
foreach ($users as $user) {
|
||||
if ($user['status'] === 'delivered') {
|
||||
$completedOrders++;
|
||||
}
|
||||
$totalAmount += floatval($user['total_amount']);
|
||||
}
|
||||
|
||||
$orderCompletionRate = $totalUsers > 0 ? ($completedOrders / $totalUsers) * 100 : 0;
|
||||
$averageOrderValue = $totalUsers > 0 ? $totalAmount / $totalUsers : 0;
|
||||
|
||||
return [
|
||||
'total_users' => $totalUsers,
|
||||
'completed_orders' => $completedOrders,
|
||||
'order_completion_rate' => $orderCompletionRate,
|
||||
'average_order_value' => $averageOrderValue
|
||||
];
|
||||
}
|
||||
public function ordersReport(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'orders_analytics', new ProfileQuestion);
|
||||
$start_date = $request->get('start_date');
|
||||
$end_date = $request->get('end_date');
|
||||
$status = $request->get('status');
|
||||
$patient = $request->get('patient');
|
||||
$query = Cart::select(
|
||||
'carts.id as order_id',
|
||||
'carts.status',
|
||||
'carts.email',
|
||||
'carts.total_amount',
|
||||
'carts.created_at as date',
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name) as patient_name")
|
||||
)
|
||||
->where('carts.created_at', '>=', $start_date . " 00:00:00")
|
||||
->where('carts.created_at', '<=', $end_date . " 23:59:59");
|
||||
|
||||
// Apply filters
|
||||
if ($status != 'all') {
|
||||
$query->where('carts.status', $status);
|
||||
}
|
||||
|
||||
if ($patient != 'all') {
|
||||
$query->where('carts.patient_id', $patient);
|
||||
}
|
||||
$dates = [];
|
||||
$sales = [];
|
||||
$startDate = Carbon::parse($start_date);
|
||||
$endDate = Carbon::parse($end_date);
|
||||
for ($date = $startDate; $date->lte($endDate); $date->addDay()) {
|
||||
$values = Cart::select(
|
||||
DB::raw('DATE(created_at) as date'),
|
||||
DB::raw("SUM(carts.total_amount) as amount")
|
||||
)
|
||||
->where('carts.created_at', '>=', $date->format("Y-m-d") . " 00:00:00")
|
||||
->where('carts.created_at', '<=', $date->format("Y-m-d") . " 23:59:59")
|
||||
->groupBy(DB::raw('DATE(created_at)'));
|
||||
if ($status != 'all') {
|
||||
$values->where('carts.status', $status);
|
||||
}
|
||||
|
||||
if ($patient != 'all') {
|
||||
$values->where('carts.patient_id', $patient);
|
||||
}
|
||||
$graphsValues = $values->first();
|
||||
|
||||
$dates[] = $date->format("M d/y");
|
||||
if ($graphsValues)
|
||||
$sales[] = $graphsValues->amount;
|
||||
else
|
||||
$sales[] = 0;
|
||||
}
|
||||
// dd(Constant::getFullSql($query));
|
||||
$orderCollection = $query->get();
|
||||
$orderData = $orderCollection->map(function ($cart) {
|
||||
$patientType = Cart::where('email', $cart->email)->count();
|
||||
|
||||
$itemSold = Item::select(DB::raw("GROUP_CONCAT(plans_v1.title SEPARATOR ', ') as items"))
|
||||
->where('cart_id', $cart->order_id)
|
||||
->leftJoin('plans_v1', 'items.plans_id', 'plans_v1.id');
|
||||
$itemCount = $itemSold->count();
|
||||
$products = $itemSold->first();
|
||||
|
||||
$cart->customer_type = $patientType > 1 ? 'returning' : 'new';
|
||||
$cart->products = $products->items ?? null;
|
||||
$cart->item_sold = $itemCount ?? null;
|
||||
$cart->attribution = 'direct';
|
||||
|
||||
return $cart;
|
||||
});
|
||||
$totalOrdersStats = Cart::select(
|
||||
// DB::raw("sum(case when carts.status = 'delivered' then 1 else 0 end) as total_sales"),
|
||||
DB::raw("count(carts.id) as total_sales"),
|
||||
DB::raw("sum(carts.total_amount ) as sales_amount"),
|
||||
DB::raw("count(items.id) as products_sold")
|
||||
)
|
||||
->Join('items', 'items.cart_id', 'carts.id')
|
||||
->where('carts.created_at', '>=', $start_date . " 00:00:00")
|
||||
->where('carts.created_at', '<=', $end_date . " 23:59:59");
|
||||
|
||||
if ($status != 'all') {
|
||||
|
||||
$totalOrdersStats->where('carts.status', $status);
|
||||
}
|
||||
|
||||
if ($patient != 'all') {
|
||||
$totalOrdersStats->where('carts.patient_id', $patient);
|
||||
}
|
||||
$totals = $totalOrdersStats->get();
|
||||
return response()->json([
|
||||
'orders' => $orderData,
|
||||
'totals' => $totals,
|
||||
'chart' => [
|
||||
'chart_dates' => $dates,
|
||||
'chart_data' => $sales
|
||||
]
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function productAnalytics(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'orders_analytics', new ProfileQuestion);
|
||||
$start_date = $request->get('start_date');
|
||||
$end_date = $request->get('end_date');
|
||||
$singleProduct = $request->get('single_product');
|
||||
$patient = $request->get('patient');
|
||||
$query = Item::select(
|
||||
DB::raw("sum(case when items.status='delivered' then items.quantity else 0 end) as total_item_sold"),
|
||||
DB::raw("sum(case when items.status='delivered' then 1 else 0 end) as total_orders"),
|
||||
DB::raw("sum(case when items.status='delivered' then (items.quantity*plans_v1.price) else 0 end) as total_amount"),
|
||||
'plans_v1.title as product_name',
|
||||
'items.plans_id as product_id'
|
||||
)
|
||||
->leftJoin('plans_v1', 'plans_v1.id', 'items.plans_id')
|
||||
->where('items.created_at', '>=', $start_date . " 00:00:00")
|
||||
->where('items.created_at', '<=', $end_date . " 23:59:59")
|
||||
->where('items.status', 'delivered')
|
||||
->groupby('plans_v1.title', 'items.plans_id');
|
||||
// Apply filters
|
||||
if ($singleProduct != 'all') {
|
||||
$query->where('items.plans_id', $singleProduct);
|
||||
}
|
||||
|
||||
$dates = [];
|
||||
$sales = [];
|
||||
$startDate = Carbon::parse($start_date);
|
||||
$endDate = Carbon::parse($end_date);
|
||||
for ($date = $startDate; $date->lte($endDate); $date->addDay()) {
|
||||
$graphsValues = Item::select(
|
||||
DB::raw("sum(case when items.status='delivered' then 1 else 0 end) as total_orders"),
|
||||
DB::raw("sum(case when items.status='delivered' then (items.quantity*plans_v1.price) else 0 end) as total_amount"),
|
||||
)
|
||||
->leftJoin('plans_v1', 'plans_v1.id', 'items.plans_id')
|
||||
->where('items.created_at', '>=', $date->format("Y-m-d") . " 00:00:00")
|
||||
->where('items.created_at', '<=', $date->format("Y-m-d") . " 23:59:59")
|
||||
->where('items.status', 'delivered')
|
||||
->groupby('plans_v1.title', 'items.plans_id');
|
||||
|
||||
if ($singleProduct != 'all') {
|
||||
$graphsValues->where('items.plans_id', $singleProduct);
|
||||
}
|
||||
|
||||
$graphVal = $graphsValues->first();
|
||||
|
||||
$dates[] = $date->format("M d/y");
|
||||
if ($graphVal)
|
||||
$sales[] = $graphVal->total_amount;
|
||||
else
|
||||
$sales[] = 0;
|
||||
}
|
||||
$orderData = $query->get();
|
||||
$totalOrdersStats = Item::select(
|
||||
DB::raw("count(items.id) as total_orders"),
|
||||
DB::raw("sum(case when items.status='delivered' then (items.quantity*plans_v1.price) else 0 end) as sales_amount"),
|
||||
DB::raw("sum(case when items.status='delivered' then items.quantity else 0 end) as products_sold")
|
||||
)
|
||||
->leftJoin('plans_v1', 'plans_v1.id', 'items.plans_id')
|
||||
->where('items.created_at', '>=', $start_date . " 00:00:00")
|
||||
->where('items.created_at', '<=', $end_date . " 23:59:59")
|
||||
->where('items.status', 'delivered');
|
||||
|
||||
if ($singleProduct != 'all') {
|
||||
$totalOrdersStats->where('items.plans_id', $singleProduct);
|
||||
}
|
||||
$totals = $totalOrdersStats->get();
|
||||
return response()->json([
|
||||
'orders' => $orderData,
|
||||
'totals' => $totals,
|
||||
'chart' => [
|
||||
'chart_dates' => $dates,
|
||||
'chart_data' => $sales
|
||||
]
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function totalSales()
|
||||
{
|
||||
$start_date = request()->input('start_date');
|
||||
$end_date = request()->input('end_date');
|
||||
$startDate = Carbon::parse($start_date);
|
||||
$endDate = Carbon::parse($end_date);
|
||||
$sales = [];
|
||||
for ($date = $startDate; $date->lte($endDate); $date->addDay()) {
|
||||
$graphsValues = Item::select(
|
||||
DB::raw("sum(case when items.status='delivered' then 1 else 0 end) as total_orders"),
|
||||
DB::raw("sum(case when items.status='delivered' then (items.quantity*plans_v1.price) else 0 end) as total_amount"),
|
||||
)
|
||||
->leftJoin('plans_v1', 'plans_v1.id', 'items.plans_id')
|
||||
->where('items.created_at', '>=', $date->format("Y-m-d") . " 00:00:00")
|
||||
->where('items.created_at', '<=', $date->format("Y-m-d") . " 23:59:59")
|
||||
->where('items.status', 'delivered')
|
||||
->groupby('plans_v1.title', 'items.plans_id');
|
||||
|
||||
$graphVal = $graphsValues->first();
|
||||
|
||||
$dates[] = $date->format("M d/y");
|
||||
if ($graphVal) {
|
||||
$sales[$date->format("Y-m-d")] = ["total_amount" => $graphVal->total_amount, "order_count" => $graphVal->total_orders];
|
||||
} else {
|
||||
$sales[$date->format("Y-m-d")] = ["total_amount" => 0, "order_count" => 0];
|
||||
}
|
||||
}
|
||||
dd($dates, $sales);
|
||||
}
|
||||
public function ordersAnalytics(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'orders_analytics', new ProfileQuestion);
|
||||
$start_date = $request->get('start_date');
|
||||
$end_date = $request->get('end_date');
|
||||
$singleProduct = $request->get('single_product');
|
||||
$query = Cart::select(
|
||||
'carts.id as order_id',
|
||||
"carts.status as order_status",
|
||||
"carts.created_at as order_date",
|
||||
DB::raw("GROUP_CONCAT(plans_v1.title SEPARATOR ', ') as items"),
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name) as patient_name"),
|
||||
"carts.total_amount",
|
||||
DB::raw("sum(case when carts.status='completed' then 1 else 0 end) as item_sold")
|
||||
)
|
||||
->leftJoin('items', 'items.cart_id', 'carts.id')
|
||||
->leftJoin('plans_v1', 'plans_v1.id', 'items.plans_id')
|
||||
->where('carts.created_at', '>=', $start_date . " 00:00:00")
|
||||
->where('carts.created_at', '<=', $end_date . " 23:59:59")
|
||||
->where('carts.status', 'completed')
|
||||
->groupby('carts.id',
|
||||
'carts.status',
|
||||
'carts.created_at',
|
||||
DB::raw("CONCAT(carts.first_name,' ',carts.last_name)"),
|
||||
"carts.total_amount");
|
||||
|
||||
$dates = [];
|
||||
$sales = [];
|
||||
$singleMonth = [];
|
||||
$current_month = null;
|
||||
$graphDates = null;
|
||||
$startDate = Carbon::parse($start_date);
|
||||
$endDate = Carbon::parse($end_date);
|
||||
for ($date = $startDate; $date->lte($endDate); $date->addDay())
|
||||
{
|
||||
$graphsValues = Cart::select(
|
||||
DB::raw('DATE(created_at) as date'),
|
||||
DB::raw("SUM(carts.total_amount) as amount")
|
||||
)
|
||||
->where('carts.created_at', '>=', $date->format("Y-m-d") . " 00:00:00")
|
||||
->where('carts.created_at', '<=', $date->format("Y-m-d") . " 23:59:59")
|
||||
->where('carts.status', 'completed')
|
||||
->groupBy(DB::raw('DATE(created_at)'));
|
||||
$graphVal = $graphsValues->first();
|
||||
|
||||
$month = $date->format('F Y');
|
||||
|
||||
if ($month != $current_month)
|
||||
{
|
||||
// Month has changed or it's the first iteration, echo the first day of the month
|
||||
$dates[] = $month;
|
||||
$current_month = $month;
|
||||
} else {
|
||||
|
||||
$dates[] = " ";
|
||||
}
|
||||
|
||||
$singleMonth[] = $date->format("M d/y");
|
||||
|
||||
if ($graphVal)
|
||||
$sales[] = $graphVal->amount;
|
||||
else
|
||||
$sales[] = 0;
|
||||
}
|
||||
// count if user select more then one month
|
||||
$dateIterate = $this->monthItrator($start_date, $end_date);
|
||||
if ($dateIterate == 1)
|
||||
$graphDates = $singleMonth;
|
||||
else
|
||||
$graphDates = $dates;
|
||||
|
||||
$orderData = $query->get();
|
||||
$totalOrdersStats = Item::select(
|
||||
DB::raw("count(items.id) as total_orders"),
|
||||
DB::raw("sum(case when items.status='delivered' then (items.quantity*plans_v1.price) else 0 end) as sales_amount"),
|
||||
DB::raw("sum(case when items.status='delivered' then items.quantity else 0 end) as products_sold")
|
||||
)
|
||||
->leftJoin('plans_v1', 'plans_v1.id', 'items.plans_id')
|
||||
->where('items.created_at', '>=', $start_date . " 00:00:00")
|
||||
->where('items.created_at', '<=', $end_date . " 23:59:59")
|
||||
->where('items.status', 'delivered');
|
||||
|
||||
$totals = $totalOrdersStats->get();
|
||||
return response()->json([
|
||||
'orders' => $orderData,
|
||||
'totals' => $totals,
|
||||
'chart' => [
|
||||
'chart_dates' => $graphDates,
|
||||
'chart_data' => $sales
|
||||
]
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function monthItrator($start_date, $end_date)
|
||||
{
|
||||
|
||||
$start = (clone Carbon::parse($start_date))->modify('first day of this month');
|
||||
$end = (clone Carbon::parse($end_date))->modify('first day of next month');
|
||||
|
||||
$interval = DateInterval::createFromDateString('1 month');
|
||||
$period = new DatePeriod($start, $interval, $end);
|
||||
return iterator_count($period);
|
||||
}
|
||||
}
|
105
app/Http/Controllers/Admin/Api/SiteSettingsController.php
Normal file
105
app/Http/Controllers/Admin/Api/SiteSettingsController.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Admin;
|
||||
use App\Models\Setting;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
class SiteSettingsController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function getSiteSettings(Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'list', new Setting);
|
||||
$settings = Setting::first();
|
||||
$favicon = $this->url->to("/" . $settings->favicon);
|
||||
$logo = $this->url->to("/assets/logo/" . $settings->logo);
|
||||
$settings['favicon'] = $favicon;
|
||||
$settings['logo'] = $logo;
|
||||
return response()->json([
|
||||
'settings_data' => $settings
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function updateSettings($id, Request $request)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new Setting);
|
||||
$settings = Setting::find($id);
|
||||
//upload website logo
|
||||
$fileName = 'logo-' . time();
|
||||
$logoPath = public_path() . '/assets/logo/';
|
||||
$imageName = $this->uploadImage($request->get('logo'), $fileName, $logoPath);
|
||||
////////////////
|
||||
//upload favicon
|
||||
$fileName = 'favicon-' . time();
|
||||
$faviconPath = public_path('/');
|
||||
$faviconImageName = $this->uploadImage($request->get('favicon'), $fileName, $faviconPath);
|
||||
/////////////////////////////
|
||||
$settings->plan_main_title = $request->get('plan_main_title');
|
||||
$settings->plan_description = $request->get('plan_description');
|
||||
$settings->plan_description_pargraph = $request->get('plan_description_pargraph');
|
||||
if ($request->get('logo'))
|
||||
$settings->logo = $imageName;
|
||||
$settings->footer_text = $request->get('footer_text');
|
||||
if ($request->get('favicon'))
|
||||
$settings->favicon = $faviconImageName;
|
||||
$settings->header_title = $request->get('header_title');
|
||||
$settings->domain_name = $request->get('domain_name');
|
||||
$settings->save();
|
||||
return response()->json([
|
||||
'msg' => "Settings updated "
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function uploadImage($image, $fileName, $path)
|
||||
{
|
||||
try{
|
||||
$this->authorizeForUser($this->user,'edit', new Setting);
|
||||
$logo = base64_decode($image);
|
||||
$filename = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[0]);
|
||||
$ext = (explode('/', finfo_buffer(finfo_open(), $logo, FILEINFO_MIME_TYPE))[1]);
|
||||
$imageName = $fileName . '.' . $ext;
|
||||
$path = $path . $imageName;
|
||||
file_put_contents($path, $logo);
|
||||
return $imageName;
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function passwordReset(Request $request)
|
||||
{
|
||||
$userId = Auth::guard('admin')->user()->id;
|
||||
$user = Admin::find($userId);
|
||||
if (Hash::check($request->get('password'), $user->password)) {
|
||||
$password = $request->get('new_password');
|
||||
$user->password = bcrypt($password);
|
||||
$user->save();
|
||||
return response()->json([
|
||||
'msg' => "Password updated"
|
||||
]);
|
||||
} else {
|
||||
return response()->json([
|
||||
'msg' => "Password does not match",
|
||||
'status' => 'error'
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
225
app/Http/Controllers/Admin/Api/SubscriptionController.php
Normal file
225
app/Http/Controllers/Admin/Api/SubscriptionController.php
Normal file
@@ -0,0 +1,225 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use Agence104\LiveKit\VideoGrant;
|
||||
use App\Classes\Constant;
|
||||
use App\Events\AppointmentBooked;
|
||||
use App\Events\PaymentProcessed;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Admin;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\Item;
|
||||
use App\Models\ItemHistory;
|
||||
use App\Models\Lab;
|
||||
use App\Models\LabKit;
|
||||
use App\Models\LabkitOrderItem;
|
||||
use App\Models\LicenseNumberModel;
|
||||
use App\Models\MedicalHistoryAnswer;
|
||||
use App\Models\Patient;
|
||||
use App\Models\PatientNote;
|
||||
use App\Models\PatientPlan;
|
||||
use App\Models\PatientPrescription;
|
||||
use App\Models\PatientRegActivity;
|
||||
use App\Models\Plan;
|
||||
use App\Models\PlanV1;
|
||||
use App\Models\Prescription;
|
||||
use App\Models\ProfileAnswer;
|
||||
use App\Models\ProfileCategory;
|
||||
use App\Models\QuestionBuilder;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Subscription;
|
||||
use App\Models\Telemedpro;
|
||||
use Carbon\Carbon;
|
||||
use Carbon\CarbonTimeZone;
|
||||
use DateTime;
|
||||
use DateTimeZone;
|
||||
use Error;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Agence104\LiveKit\AccessToken;
|
||||
use Agence104\LiveKit\AccessTokenOptions;
|
||||
use Agence104\LiveKit\RoomCreateOptions;
|
||||
use Agence104\LiveKit\RoomServiceClient;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
|
||||
class SubscriptionController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
|
||||
public function getSubscriptionList()
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Subscription);
|
||||
|
||||
$subscriptions = Subscription::with(['cart', 'item.plansV1', 'patient'])
|
||||
->join('patients', 'subscription.patient_id', '=', 'patients.id') // Join with the patient table
|
||||
->join('items', 'subscription.item_id', '=', 'items.id') // Join with the plansV1 table
|
||||
->join('plans_v1', 'items.plans_id', '=', 'plans_v1.id') // Join with the plansV1 table
|
||||
|
||||
->select([
|
||||
'subscription.*',
|
||||
'patients.first_name',
|
||||
'patients.last_name',
|
||||
'plans_v1.title as product_title',
|
||||
'plans_v1.price as price'
|
||||
]); // Select necessary columns
|
||||
|
||||
return DataTables::of($subscriptions)
|
||||
->addColumn('product_title', function ($subscription) {
|
||||
return $subscription->item?->plansV1?->title ?? 'N/A';
|
||||
})
|
||||
->addColumn('price', function ($subscription) {
|
||||
return $subscription->item?->plansV1?->price ?? 'N/A';
|
||||
})
|
||||
->addColumn('currency', function ($subscription) {
|
||||
$plan = $subscription->item?->plansV1;
|
||||
return $plan ? $plan->currency : 'N/A';
|
||||
})
|
||||
->addColumn('first_name', function ($subscription) {
|
||||
return $subscription->first_name ?? 'N/A';
|
||||
})
|
||||
->addColumn('last_name', function ($subscription) {
|
||||
return $subscription->last_name ?? 'N/A';
|
||||
})
|
||||
->filterColumn('first_name', function ($query, $keyword) {
|
||||
$query->where('patients.first_name', 'like', "%{$keyword}%");
|
||||
})
|
||||
->filterColumn('last_name', function ($query, $keyword) {
|
||||
$query->where('patients.last_name', 'like', "%{$keyword}%");
|
||||
})
|
||||
->filterColumn('product_title', function ($query, $keyword) {
|
||||
$query->where('plans_v1.title', 'like', "%{$keyword}%");
|
||||
})
|
||||
->filterColumn('product_price', function ($query, $keyword) {
|
||||
$query->where('plans_v1.price', 'like', "%{$keyword}%");
|
||||
})
|
||||
->make(true);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function updateSubscription(Request $request, $subid)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'edit', new Subscription);
|
||||
// Find the subscription
|
||||
$subscription = Subscription::find($subid);
|
||||
if (!$subscription) {
|
||||
return response()->json(['message' => 'Subscription not found'], 404);
|
||||
}
|
||||
// Define the fillable fields
|
||||
$fillable = [
|
||||
'subscription_start_date',
|
||||
'subscription_renewal_date',
|
||||
'subscription_status',
|
||||
'cart_id',
|
||||
'item_id',
|
||||
'patient_id',
|
||||
'status'
|
||||
];
|
||||
// Filter the request data to only include fillable fields that are present
|
||||
$dataToUpdate = array_filter(
|
||||
$request->only($fillable),
|
||||
function ($value) {
|
||||
return $value !== null;
|
||||
}
|
||||
);
|
||||
|
||||
// Validate the filtered data
|
||||
$validator = Validator::make($dataToUpdate, [
|
||||
'subscription_start_date' => 'required',
|
||||
'subscription_renewal_date' => 'required',
|
||||
'subscription_status' => 'string',
|
||||
'cart_id' => 'exists:carts,id',
|
||||
'item_id' => 'exists:items,id',
|
||||
'patient_id' => 'exists:patients,id',
|
||||
'status' => 'string',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json(['errors' => $validator->errors()], 422);
|
||||
}
|
||||
// Update the subscription
|
||||
$subscription->update($dataToUpdate);
|
||||
|
||||
return response()->json(['message' => 'Subscription updated successfully', 'data' => $subscription], 200);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function CreateSubscription(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'add', new Subscription);
|
||||
// Validate the incoming request data
|
||||
$validator = Validator::make($request->all(), [
|
||||
'subscription_start_date' => 'required',
|
||||
'subscription_renewal_date' => 'required',
|
||||
'subscription_status' => 'required',
|
||||
'cart_id' => 'required|exists:carts,id',
|
||||
'item_id' => 'required|exists:items,id',
|
||||
'patient_id' => 'required|exists:patients,id',
|
||||
//'status' => 'required'
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json(['errors' => $validator->errors()], 422);
|
||||
}
|
||||
|
||||
// Create the subscription
|
||||
$subscription = Subscription::create($request->all());
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Subscription created successfully',
|
||||
'data' => $subscription
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
public function getSubscription(Subscription $subscription, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Subscription);
|
||||
return response()->json([
|
||||
'data' => $subscription
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function deleteSubscription(Subscription $subscription, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'delete', new Subscription);
|
||||
$subscription->delete();
|
||||
return response()->json([
|
||||
'status' => 'deleted',
|
||||
'message' => 'subscription deleted'
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
425
app/Http/Controllers/Admin/Api/TelemedProAgentController.php
Normal file
425
app/Http/Controllers/Admin/Api/TelemedProAgentController.php
Normal file
@@ -0,0 +1,425 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Api;
|
||||
|
||||
use App\Classes\Constant;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Telemedpro;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use App\Models\Appointment;
|
||||
use App\Models\Cart;
|
||||
use App\Models\PatientNote;
|
||||
use App\Models\PatientPrescription;
|
||||
use App\Models\Subscription;
|
||||
use Carbon\Carbon;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
use Yajra\DataTables\DataTables;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
|
||||
class TelemedProAgentController extends Controller
|
||||
{
|
||||
protected $url;
|
||||
protected $user;
|
||||
public function __construct(UrlGenerator $url)
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->user = Auth::guard('admin')->user();
|
||||
}
|
||||
public function register(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'add', new Telemedpro);
|
||||
// Validate the request data
|
||||
$validator = Validator::make($request->all(), [
|
||||
'first_name' => ['required', 'string', 'max:255'],
|
||||
'last_name' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:telemed_pros'],
|
||||
'password' => ['required', 'string', 'min:8'],
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'errors' => $validator->errors()
|
||||
], 422);
|
||||
}
|
||||
|
||||
$first_name = $request->input('first_name');
|
||||
$last_name = $request->input('last_name');
|
||||
$email = $request->input('email');
|
||||
$digits = 4;
|
||||
$code = rand(pow(10, $digits - 1), pow(10, $digits) - 1);
|
||||
|
||||
// Prepare data for creating a new Telemedpro user
|
||||
$userData = [
|
||||
'name' => $first_name . " " . $last_name,
|
||||
'first_name' => $first_name,
|
||||
'last_name' => $last_name,
|
||||
'email' => $email,
|
||||
'password' => Hash::make($request->input('password')),
|
||||
'status' => 1,
|
||||
'email_verification' => $code,
|
||||
'home_address' => $request->input('home_address'),
|
||||
'city' => $request->input('city'),
|
||||
'state' => $request->input('state'),
|
||||
'zip_code' => $request->input('zip_code'),
|
||||
'medical_license_number' => json_encode($request->input('medical_license_number')), // Convert to JSON string
|
||||
'years_of_experience' => $request->input('years_of_experience'),
|
||||
'specialty' => $request->input('specialty'),
|
||||
'gender' => $request->input('gender'),
|
||||
'practice_state' => json_encode($request->input('practice_state')), // Convert to JSON string
|
||||
'phone_number' => $request->input('phone'),
|
||||
'availability_from' => $request->input('availabilityFrom'),
|
||||
'availability_to' => $request->input('availabilityTo'),
|
||||
];
|
||||
|
||||
// Create the new user
|
||||
$user = Telemedpro::create($userData);
|
||||
|
||||
// Create an auth token
|
||||
$token = $user->createToken('auth_token')->plainTextToken;
|
||||
|
||||
return response()->json([
|
||||
'user' => $user,
|
||||
'token' => $token,
|
||||
'message' => 'User registered successfully',
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function details($id)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'view', new Telemedpro);
|
||||
return response()->json([
|
||||
'provider' => Telemedpro::find($id)
|
||||
|
||||
], 201);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function telemedProFullDetail(Telemedpro $telemed)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'view', new Telemedpro);
|
||||
$upcomingMeetings = Cart::select(
|
||||
'carts.id as order_id',
|
||||
'appointments.id',
|
||||
'appointments.patient_id',
|
||||
'appointments.appointment_time',
|
||||
'appointments.appointment_date',
|
||||
DB::raw(
|
||||
'CONCAT(patients.first_name, " " , patients.last_name) as patient_name'
|
||||
)
|
||||
)
|
||||
->join('appointments', 'appointments.id', 'carts.appointment_id')
|
||||
->leftJoin('patients', 'patients.id', 'appointments.patient_id')
|
||||
->where("appointments.telemed_pros_id", $telemed->id)
|
||||
->where('appointments.appointment_date', ">=", Carbon::now()->format("Y-m-d"))
|
||||
->get();
|
||||
$completedMeetings = Cart::select(
|
||||
'carts.id as order_id',
|
||||
'appointments.patient_id',
|
||||
'appointments.appointment_time',
|
||||
'appointments.appointment_date',
|
||||
'appointments.start_time',
|
||||
'appointments.end_time',
|
||||
'telemed_pros.name as provider_name',
|
||||
'appointments.telemed_pros_id as provider_id',
|
||||
|
||||
DB::raw(
|
||||
'CONCAT(patients.first_name, " " , patients.last_name) as patient_name'
|
||||
)
|
||||
)
|
||||
->join('appointments', 'appointments.id', 'carts.appointment_id')
|
||||
->leftJoin('patients', 'patients.id', 'appointments.patient_id')
|
||||
->leftJoin('telemed_pros', 'telemed_pros.id', 'appointments.telemed_pros_id')
|
||||
//->leftJoin('carts', 'appointments.id', 'carts.appointment_id')
|
||||
->where("appointments.telemed_pros_id", $telemed->id)
|
||||
->where('appointments.start_time', "!=", null)
|
||||
->where('appointments.end_time', "!=", null)
|
||||
->get();
|
||||
$patientNotes = PatientNote::select(
|
||||
'patient_notes.note',
|
||||
'patient_notes.note_type',
|
||||
'telemed_pros.name as provider_name',
|
||||
'telemed_pros.id as provider_id',
|
||||
'patient_notes.created_at',
|
||||
'carts.id as order_id',
|
||||
'patient_notes.created_by_id',
|
||||
'patient_notes.created_by_type'
|
||||
)
|
||||
->leftJoin('telemed_pros', 'patient_notes.telemed_pros_id', 'telemed_pros.id')
|
||||
->leftJoin('appointments', 'patient_notes.appointment_id', 'appointments.id')
|
||||
->leftJoin('carts', 'appointments.id', 'carts.appointment_id')
|
||||
->where("appointments.telemed_pros_id", $telemed->id)
|
||||
->get();
|
||||
|
||||
foreach ($patientNotes as $notes) {
|
||||
if ($notes->note_type != 'Notes')
|
||||
$notes->note = $this->url->to("assets/files/" . $notes->patient_id . ".png");
|
||||
else
|
||||
$notes->note = $notes->note;
|
||||
}
|
||||
$patientPrescription = PatientPrescription::select(
|
||||
'patient_prescription.*',
|
||||
'telemed_pros.name as provider_name',
|
||||
'prescriptions.*',
|
||||
'carts.id as order_id'
|
||||
)
|
||||
->leftJoin('appointments', 'patient_prescription.appointment_id', 'appointments.id')
|
||||
->leftJoin('carts', 'appointments.id', 'carts.appointment_id')
|
||||
->leftJoin('telemed_pros', 'appointments.telemed_pros_id', 'telemed_pros.id')
|
||||
->leftJoin('prescriptions', 'prescriptions.id', 'patient_prescription.prescription_id')
|
||||
->where('appointments.telemed_pros_id', $telemed->id)->get();
|
||||
return response()->json([
|
||||
'telemed' => $telemed,
|
||||
'upcomingMeetings' => $upcomingMeetings,
|
||||
'completed_meetings' => $completedMeetings,
|
||||
'notes' => $patientNotes,
|
||||
'prescriptions' => $patientPrescription,
|
||||
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function telemedList(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'list', new Telemedpro);
|
||||
// Get filter inputs from the request
|
||||
$practiceState = $request->input('practice_state');
|
||||
$gender = $request->input('gender');
|
||||
$specialty = $request->input('specialty');
|
||||
$state = $request->input('state');
|
||||
$search = $request->input('search');
|
||||
$availabilityFrom = $request->input('availability_from');
|
||||
$availabilityTo = $request->input('availability_to');
|
||||
|
||||
// Build the query with optional filters and join
|
||||
$query = Telemedpro::query()
|
||||
->leftJoin('appointments', 'telemed_pros.id', '=', 'appointments.telemed_pros_id')
|
||||
->leftJoin('carts', 'appointments.id', '=', 'carts.appointment_id')
|
||||
->select(
|
||||
'telemed_pros.id',
|
||||
'telemed_pros.name',
|
||||
'telemed_pros.first_name',
|
||||
'telemed_pros.last_name',
|
||||
'telemed_pros.email',
|
||||
'telemed_pros.is_busy',
|
||||
'telemed_pros.recording_switch',
|
||||
'telemed_pros.ai_switch',
|
||||
'telemed_pros.status',
|
||||
'telemed_pros.practice_state',
|
||||
'telemed_pros.phone_number',
|
||||
'telemed_pros.gender',
|
||||
'telemed_pros.specialty',
|
||||
'telemed_pros.home_address',
|
||||
'telemed_pros.medical_license_number',
|
||||
'telemed_pros.years_of_experience',
|
||||
'telemed_pros.email_verification',
|
||||
'telemed_pros.city',
|
||||
'telemed_pros.state',
|
||||
'telemed_pros.zip_code',
|
||||
'telemed_pros.availability_to',
|
||||
'telemed_pros.availability_from'
|
||||
)
|
||||
->selectRaw('COUNT(DISTINCT carts.id) as meeting_count')
|
||||
->groupBy(
|
||||
'telemed_pros.id',
|
||||
'telemed_pros.name',
|
||||
'telemed_pros.first_name',
|
||||
'telemed_pros.last_name',
|
||||
'telemed_pros.email',
|
||||
'telemed_pros.is_busy',
|
||||
'telemed_pros.recording_switch',
|
||||
'telemed_pros.ai_switch',
|
||||
'telemed_pros.status',
|
||||
'telemed_pros.practice_state',
|
||||
'telemed_pros.phone_number',
|
||||
'telemed_pros.gender',
|
||||
'telemed_pros.specialty',
|
||||
'telemed_pros.home_address',
|
||||
'telemed_pros.medical_license_number',
|
||||
'telemed_pros.years_of_experience',
|
||||
'telemed_pros.email_verification',
|
||||
'telemed_pros.city',
|
||||
'telemed_pros.state',
|
||||
'telemed_pros.zip_code',
|
||||
'telemed_pros.availability_to',
|
||||
'telemed_pros.availability_from'
|
||||
);
|
||||
|
||||
if ($practiceState && $practiceState !== 'All') {
|
||||
$query->where('telemed_pros.practice_state', $practiceState);
|
||||
}
|
||||
if ($gender && $gender !== 'All') {
|
||||
$query->where('telemed_pros.gender', $gender);
|
||||
}
|
||||
if ($specialty && $specialty !== 'All') {
|
||||
$query->where('telemed_pros.specialty', $specialty);
|
||||
}
|
||||
if ($state && $state !== 'All') {
|
||||
$query->where('telemed_pros.state', $state);
|
||||
}
|
||||
if ($availabilityFrom && $availabilityFrom !== 'All') {
|
||||
$query->where('telemed_pros.availability_from', '<=', $availabilityFrom);
|
||||
}
|
||||
if ($availabilityTo && $availabilityTo !== 'All') {
|
||||
$query->where('telemed_pros.availability_to', '>=', $availabilityTo);
|
||||
}
|
||||
return DataTables::of($query)
|
||||
->addColumn('availability_from', function ($telemedpro) {
|
||||
return $telemedpro->availability_from;
|
||||
})
|
||||
->addColumn('availability_to', function ($telemedpro) {
|
||||
return $telemedpro->availability_to;
|
||||
})
|
||||
->addColumn('specialty', function ($telemedpro) {
|
||||
return $telemedpro->specialty;
|
||||
})
|
||||
->addColumn('meeting_count', function ($telemedpro) {
|
||||
return $telemedpro->meeting_count;
|
||||
})
|
||||
->make(true);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
public function telemed(Telemedpro $telemed)
|
||||
{
|
||||
return response()->json([
|
||||
'patient' => $telemed
|
||||
]);
|
||||
}
|
||||
public function telemedDelete(Telemedpro $telemed)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'delete', new Telemedpro);
|
||||
$telemed->delete();
|
||||
return response()->json([
|
||||
'message' => "Deleted Successfully"
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function telemedUpdate(Telemedpro $telemed, Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'delete', new Subscription);
|
||||
$first_name = $request->input('first_name');
|
||||
$last_name = $request->input('last_name');
|
||||
$email = $request->input('email');
|
||||
|
||||
|
||||
$telemed->name = $first_name . " " . $last_name;
|
||||
$telemed->first_name = $first_name;
|
||||
$telemed->last_name = $last_name;
|
||||
$telemed->email = $email;
|
||||
$telemed->password = Hash::make($request->input('password'));
|
||||
$telemed->status = 1;
|
||||
$telemed->home_address = $request->input('home_address');
|
||||
$telemed->city = $request->input('city');
|
||||
$telemed->state = $request->input('state');
|
||||
$telemed->zip_code = $request->input('zip_code');
|
||||
$telemed->medical_license_number = json_encode($request->input('medical_license_number')); // Convert to JSON string
|
||||
$telemed->years_of_experience = $request->input('years_of_experience');
|
||||
$telemed->specialty = $request->input('specialty');
|
||||
$telemed->gender = $request->input('gender');
|
||||
$telemed->practice_state = json_encode($request->input('practice_state')); // Convert to JSON string
|
||||
$telemed->phone_number = $request->input('phone');
|
||||
$telemed->availability_from = $request->input('availabilityFrom');
|
||||
$telemed->availability_to = $request->input('availabilityTo');
|
||||
$telemed->save();
|
||||
return response()->json([
|
||||
'message' => 'Telemedpro updated successfully',
|
||||
'telemed' => $telemed
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
public function getMeetingHistoryTelemedpro(Telemedpro $telemedpro, $filter = '12_months')
|
||||
{
|
||||
try {
|
||||
$this->authorizeForUser($this->user, 'meeting_history', new Telemedpro);
|
||||
$currentMonth = Carbon::now();
|
||||
// Filter logic
|
||||
switch ($filter) {
|
||||
case 'current_month':
|
||||
$startDate = $currentMonth->copy()->startOfMonth();
|
||||
break;
|
||||
case '1_month':
|
||||
$startDate = $currentMonth->copy()->subMonth()->startOfMonth();
|
||||
break;
|
||||
case '2_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(2)->startOfMonth();
|
||||
break;
|
||||
case '3_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(3)->startOfMonth();
|
||||
break;
|
||||
case '6_months':
|
||||
$startDate = $currentMonth->copy()->subMonths(6)->startOfMonth();
|
||||
break;
|
||||
default: // Default to 12 months
|
||||
$startDate = $currentMonth->copy()->subMonths(12)->startOfMonth();
|
||||
}
|
||||
$endDate = $currentMonth->endOfMonth();
|
||||
// Fetch patient names and appointment counts directly from the database
|
||||
$monthlyData = Appointment::select(
|
||||
'patient_id',
|
||||
'telemed_pros_id',
|
||||
'appointment_time',
|
||||
'appointment_date',
|
||||
'start_time',
|
||||
'end_time',
|
||||
'duration',
|
||||
'id'
|
||||
)
|
||||
->where("telemed_pros_id", $telemedpro->id)
|
||||
->whereNotNull("end_time")
|
||||
->whereBetween('created_at', [$startDate, $endDate])
|
||||
->get();
|
||||
$patients = [];
|
||||
foreach ($monthlyData as $dataPoint) {
|
||||
$patientName = $dataPoint->patient->first_name . " " . $dataPoint->patient->last_name; // Assuming 'name' is the field representing patient names
|
||||
/* $appointmentCount = $dataPoint->appointment_count; */
|
||||
$start_time = $dataPoint->start_time;
|
||||
$end_time = $dataPoint->end_time;
|
||||
$duration = $dataPoint->duration;
|
||||
$appointment_time = $dataPoint->appointment_time;
|
||||
$appointment_date = $dataPoint->appointment_date;
|
||||
$patient_id = $dataPoint->patient_id;
|
||||
$id = $dataPoint->id;
|
||||
|
||||
$patients[] = [
|
||||
'patient_name' => $patientName,
|
||||
'appointment_time' => $appointment_time,
|
||||
'appointment_date' => $appointment_date,
|
||||
/* 'appointment_count' => $appointmentCount, */
|
||||
'start_time' => $start_time,
|
||||
'end_time' => $end_time,
|
||||
'duration' => $duration,
|
||||
'id' => $id,
|
||||
'patient_id' => $patient_id,
|
||||
];
|
||||
}
|
||||
return response()->json([
|
||||
'patients' => $patients,
|
||||
]);
|
||||
} catch (AuthorizationException $e) {
|
||||
return $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Foundation\Auth\ConfirmsPasswords;
|
||||
|
||||
class ConfirmPasswordController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Confirm Password Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller is responsible for handling password confirmations and
|
||||
| uses a simple trait to include the behavior. You're free to explore
|
||||
| this trait and override any functions that require customization.
|
||||
|
|
||||
*/
|
||||
|
||||
use ConfirmsPasswords;
|
||||
|
||||
/**
|
||||
* Where to redirect users when the intended url fails.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = RouteServiceProvider::HOME;
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth');
|
||||
}
|
||||
}
|
22
app/Http/Controllers/Admin/Auth/ForgotPasswordController.php
Normal file
22
app/Http/Controllers/Admin/Auth/ForgotPasswordController.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
|
||||
|
||||
class ForgotPasswordController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller is responsible for handling password reset emails and
|
||||
| includes a trait which assists in sending these notifications from
|
||||
| your application to your users. Feel free to explore this trait.
|
||||
|
|
||||
*/
|
||||
|
||||
use SendsPasswordResetEmails;
|
||||
}
|
67
app/Http/Controllers/Admin/Auth/LoginController.php
Normal file
67
app/Http/Controllers/Admin/Auth/LoginController.php
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\admin\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Admin;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class LoginController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Login Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller handles authenticating users for the application and
|
||||
| redirecting them to your home screen. The controller uses a trait
|
||||
| to conveniently provide its functionality to your applications.
|
||||
|
|
||||
*/
|
||||
|
||||
use AuthenticatesUsers;
|
||||
|
||||
/**
|
||||
* Where to redirect users after login.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = '/admin';
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('guest')->except('logout');
|
||||
}
|
||||
|
||||
public function showLoginForm()
|
||||
{
|
||||
return view('admin.auth.login');
|
||||
}
|
||||
|
||||
protected function login(Request $request)
|
||||
{
|
||||
$credentials = $request->only('email', 'password');
|
||||
|
||||
$user = Admin::where($this->username(), $credentials['email'])->first();
|
||||
|
||||
if ($user && Hash::check($credentials['password'], $user->password)) {
|
||||
Auth::guard('admin')->login($user, $request->has('remember'));
|
||||
return redirect($this->redirectTo);
|
||||
}
|
||||
|
||||
return back()->withErrors(['email' => 'Invalid credentials']);
|
||||
}
|
||||
|
||||
public function redirectPath() {
|
||||
return "/admin";
|
||||
}
|
||||
}
|
80
app/Http/Controllers/Admin/Auth/RegisterController.php
Normal file
80
app/Http/Controllers/Admin/Auth/RegisterController.php
Normal file
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\admin\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Admin;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Foundation\Auth\RegistersUsers;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class RegisterController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Register Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller handles the registration of new users as well as their
|
||||
| validation and creation. By default this controller uses a trait to
|
||||
| provide this functionality without requiring any additional code.
|
||||
|
|
||||
*/
|
||||
|
||||
use RegistersUsers;
|
||||
|
||||
/**
|
||||
* Where to redirect users after registration.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = RouteServiceProvider::HOME;
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('guest');
|
||||
}
|
||||
|
||||
public function showRegisterForm()
|
||||
{
|
||||
return view('admin.auth.register');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a validator for an incoming registration request.
|
||||
*
|
||||
* @param array $data
|
||||
* @return \Illuminate\Contracts\Validation\Validator
|
||||
*/
|
||||
protected function validator(array $data)
|
||||
{
|
||||
return Validator::make($data, [
|
||||
'name' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
|
||||
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new user instance after a valid registration.
|
||||
*
|
||||
* @param array $data
|
||||
* @return \App\Models\Admin
|
||||
*/
|
||||
protected function register(Request $request)
|
||||
{
|
||||
Admin::create([
|
||||
'name' => $request->input('name'),
|
||||
'email' => $request->input('email'),
|
||||
'password' => bcrypt($request->input('password')),
|
||||
]);
|
||||
return back();
|
||||
}
|
||||
}
|
30
app/Http/Controllers/Admin/Auth/ResetPasswordController.php
Normal file
30
app/Http/Controllers/Admin/Auth/ResetPasswordController.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Foundation\Auth\ResetsPasswords;
|
||||
|
||||
class ResetPasswordController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller is responsible for handling password reset requests
|
||||
| and uses a simple trait to include this behavior. You're free to
|
||||
| explore this trait and override any methods you wish to tweak.
|
||||
|
|
||||
*/
|
||||
|
||||
use ResetsPasswords;
|
||||
|
||||
/**
|
||||
* Where to redirect users after resetting their password.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = RouteServiceProvider::HOME;
|
||||
}
|
42
app/Http/Controllers/Admin/Auth/VerificationController.php
Normal file
42
app/Http/Controllers/Admin/Auth/VerificationController.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Foundation\Auth\VerifiesEmails;
|
||||
|
||||
class VerificationController extends Controller
|
||||
{
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Email Verification Controller
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This controller is responsible for handling email verification for any
|
||||
| user that recently registered with the application. Emails may also
|
||||
| be re-sent if the user didn't receive the original email message.
|
||||
|
|
||||
*/
|
||||
|
||||
use VerifiesEmails;
|
||||
|
||||
/**
|
||||
* Where to redirect users after verification.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $redirectTo = RouteServiceProvider::HOME;
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth');
|
||||
$this->middleware('signed')->only('verify');
|
||||
$this->middleware('throttle:6,1')->only('verify', 'resend');
|
||||
}
|
||||
}
|
70
app/Http/Controllers/Admin/DoctorController.php
Normal file
70
app/Http/Controllers/Admin/DoctorController.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Doctor;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
|
||||
class DoctorController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$doctors = Doctor::all();
|
||||
return view('admin.doctors.index', ['doctors' => $doctors]);
|
||||
}
|
||||
|
||||
public function add()
|
||||
{
|
||||
return view('admin.doctors.add');
|
||||
}
|
||||
|
||||
public function save(Request $request)
|
||||
{
|
||||
$doctor = Doctor::where('email',$request->input('email'))->first();
|
||||
if($doctor)
|
||||
{
|
||||
$request->session()->flash('error', 'The email has already been taken.');
|
||||
return redirect()->back();
|
||||
}
|
||||
Doctor::create([
|
||||
'name' => $request->input('name'),
|
||||
'email' => $request->input('email'),
|
||||
'password' => bcrypt($request->input('password')),
|
||||
]);
|
||||
$request->session()->flash('message', 'Doctor created successfully');
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$doctor = Doctor::where('id',$id)->first();
|
||||
return view('admin.doctors.edit', ['doctor' => $doctor]);
|
||||
}
|
||||
|
||||
public function update($id,Request $request)
|
||||
{
|
||||
$doctor = Doctor::where('id',$id)->first();
|
||||
$request->validate([
|
||||
'name' => 'required',
|
||||
'email' => 'required|email|unique:doctors,email,' . $id,
|
||||
// Other validation rules...
|
||||
]);
|
||||
$doctor->name = $request->input('name');
|
||||
$doctor->email = $request->input('email');
|
||||
if($request->input('password'))
|
||||
$doctor->password = $request->input('password');
|
||||
$doctor->save();
|
||||
|
||||
$request->session()->flash('message', 'Doctor updated successfully');
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
public function delete($id,Request $request)
|
||||
{
|
||||
Doctor::where('id',$id)->delete();
|
||||
$request->session()->flash('message', 'Doctor deleted successfully');
|
||||
return redirect()->back();
|
||||
}
|
||||
}
|
14
app/Http/Controllers/Admin/HomeController.php
Normal file
14
app/Http/Controllers/Admin/HomeController.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class HomeController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view('admin.home');
|
||||
}
|
||||
}
|
73
app/Http/Controllers/Admin/LabsController.php
Normal file
73
app/Http/Controllers/Admin/LabsController.php
Normal file
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Cart;
|
||||
use App\Models\Lab;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class LabsController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$labs = Lab::all();
|
||||
return view('admin.labs.index', ['labs' => $labs]);
|
||||
}
|
||||
public function create()
|
||||
{
|
||||
return view('admin.labs.create');
|
||||
}
|
||||
public function save(Request $request)
|
||||
{
|
||||
Lab::create([
|
||||
'name' => $request->name,
|
||||
'address' => $request->address,
|
||||
'city' => $request->city,
|
||||
'state' => $request->state,
|
||||
'zip_code' => $request->zip
|
||||
]);
|
||||
return redirect('admin/labs');
|
||||
}
|
||||
public function edit($id)
|
||||
{
|
||||
$labEdit = Lab::find($id);
|
||||
return view('admin.labs.edit', ['labEdit' => $labEdit]);
|
||||
}
|
||||
public function update($id, Request $request)
|
||||
{
|
||||
$labEdit = Lab::find($id);
|
||||
$labEdit->name = $request->name;
|
||||
$labEdit->address = $request->address;
|
||||
$labEdit->city = $request->city;
|
||||
$labEdit->state = $request->state;
|
||||
$labEdit->zip_code = $request->zip;
|
||||
$labEdit->save();
|
||||
return redirect('admin/labs');
|
||||
}
|
||||
public function getOrderData(Request $request)
|
||||
{
|
||||
$perPage = $request->get('per_page', 20); // Items per page (default 10)
|
||||
|
||||
// Get carts with patient data and order count
|
||||
$carts = Cart::with('patient')
|
||||
->select('patient_id', DB::raw('COUNT(*) as cart_count'))
|
||||
->groupBy('patient_id')
|
||||
->paginate($perPage);
|
||||
|
||||
// Manually create paginator instance (due to aggregation)
|
||||
$paginator = new LengthAwarePaginator(
|
||||
$carts->items(),
|
||||
$carts->total(),
|
||||
$perPage,
|
||||
$carts->currentPage()
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'status' => 'Success',
|
||||
'orderData' => $paginator
|
||||
], 200);
|
||||
}
|
||||
}
|
24
app/Http/Controllers/Admin/PatientController.php
Normal file
24
app/Http/Controllers/Admin/PatientController.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Patient;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
|
||||
class PatientController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$patients = Patient::all();
|
||||
return view('admin.patients.index', ['patients' => $patients]);
|
||||
}
|
||||
|
||||
public function delete($id,Request $request)
|
||||
{
|
||||
Patient::where('id',$id)->delete();
|
||||
$request->session()->flash('message', 'Patient deleted successfully');
|
||||
return redirect()->back();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user