purityselect/app/Http/Controllers/Admin/Api/HomeController.php
2024-10-25 01:05:27 +05:00

416 lines
14 KiB
PHP

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