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

539 lines
21 KiB
PHP

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