File: /var/www/javago-portal-updates/app/Services/CafeOrderHistoryService.php
<?php
namespace App\Services;
use App\Models\Order;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Yajra\DataTables\Facades\DataTables;
class CafeOrderHistoryService
{
private $model;
public function __construct($model)
{
$this->model = new $model();
}
public function show($id)
{
abort_if(!$id, 404);
$model = $this->model->find(decrypt($id));
abort_if(!$model, 404);
$data = [];
$data['order_id'] = $model->order_number;
$data['customer_name'] = !empty($model->user) ? $model->user->name : ' - ';
$data['group_name'] = !empty($model->group) ? $model->group->group_name : ' - ';
$data['order_time'] = Carbon::createFromTimestamp($model->order_placed_at)->timezone(session()->get('timezone'))->format('h:i A');
$data['order_date'] = Carbon::createFromTimestamp($model->order_placed_at)->timezone(session()->get('timezone'))->format('d-m-Y');
$data['members'] = Order::where('request_unique_id', $model->request_unique_id)->groupBy('request_unique_id')->count();
$data['orderId'] = encrypt($model->id);
$data['dataUrl'] = route(Auth::getDefaultDriver() . '.order-details.data');
$data['orderHistoryUrl'] = Auth::getDefaultDriver() == "cafe" ? route('cafe.order-history.index') : route('admin.customer-module.show', encrypt($model->user_id));
if (Auth::getDefaultDriver() == "cafe") {
$data['cafeDashboard'] = route('cafe.dashboard');
return view('cafe.order-history.view', $data);
} else {
return view('admin.order-history.view', $data);
}
}
public function data($request)
{
$orderFrom = $request->orderFrom != null ? Carbon::createFromFormat('Y-m-d H:i:s', $request->orderFrom . " 00:00:01")->timestamp : '';
$orderTo = $request->orderTo != null ? Carbon::createFromFormat('Y-m-d H:i:s', $request->orderTo . " 23:59:59")->timestamp : '';
$isCafe = $request->cafe != null ? $request->cafe : '';
$userId = $request->user != null ? decrypt($request->user) : '';
$today = $request->today != null ? $request->today : '';
$todayStart = Carbon::today()->startOfDay()->timestamp;
$todayEnd = Carbon::today()->endOfDay()->timestamp;
$data = $this->model->query()->join('users', 'users.id', 'orders.user_id')->select('orders.id', 'orders.order_number', 'orders.status', 'users.name', 'orders.order_placed_at', 'orders.total_amount', 'orders.order_item_array', 'orders.order_completed', 'orders.estimated_arival_time')->orderBy('orders.order_placed_at', 'desc');
if ($isCafe != "" && $isCafe != "false") {
$data->where('orders.cafe_id', Auth::user()->id);
}
if ($orderFrom != null) {
$data->where('orders.order_placed_at', '>=', $orderFrom);
}
if ($orderTo != null) {
$data->where('orders.order_placed_at', '<=', $orderTo);
}
if ($userId != null) {
$data->where('orders.user_id', $userId);
}
if ($today != "" && $today != "false") {
$data->whereBetween('orders.order_placed_at', [$todayStart, $todayEnd]);
}
return DataTables::eloquent($data)
->addIndexColumn()
->addColumn('user_name', function ($row) {
if (empty($row->name)) {
return '-';
} else {
if (strlen($row->name) > 50) {
return substr($row->name, 0, 50) . '...';
} else {
return $row->name;
}
}
})
->editColumn('order_number', function ($row) {
if (empty($row->order_number)) {
return '-';
} else {
return $row->order_number;
}
})
->editColumn('order_amount', function ($row) {
if (empty($row->total_amount)) {
return '-';
} else {
return '� ' . $row->total_amount;
}
})
->addColumn('order_time', function ($row) {
if (empty($row->order_placed_at)) {
return '-';
} else {
return Carbon::createFromTimestamp($row->order_placed_at)->timezone(session()->get('timezone'))->format('d-m-Y') . ' ' . Carbon::createFromTimestamp($row->order_placed_at)->timezone(session()->get('timezone'))->format('h:i A');
}
})
// ->addColumn('order_date', function ($row) {
// if (empty($row->order_placed_at)) {
// return '-';
// } else {
// return Carbon::createFromTimestamp($row->order_placed_at)->timezone(session()->get('timezone'))->format('d-m-Y');
// }
// })
->addColumn('order_item_array', function ($row) {
$orderItems = $row->order_item_array;
$decodedItems = json_decode($orderItems);
// Sanitize and encode the decoded items
$decodedItems = array_map(function ($item) {
return (object) [
'item_id' => $item->item_id,
'item_name' => mb_convert_encoding($item->item_name, 'UTF-8', 'UTF-8'),
'item_size' => mb_convert_encoding($item->item_size, 'UTF-8', 'UTF-8'),
'item_image' => $item->item_image,
'item_amount' => number_format((float) $item->item_amount, 2), // Convert to float and format
'item_quantity' => $item->item_quantity,
'item_description' => mb_convert_encoding($item->item_description, 'UTF-8', 'UTF-8'),
'addon_sizes' => !empty($item->addon_sizes) ? array_map(function ($addon) {
return (object) [
'addon_name' => mb_convert_encoding($addon->addon_name, 'UTF-8', 'UTF-8'),
'addon_size_name' => mb_convert_encoding($addon->addon_size_name, 'UTF-8', 'UTF-8'),
'addon_size_price' => number_format((float) $addon->addon_size_price, 2), // Convert to float and format
];
}, $item->addon_sizes) : [],
];
}, $decodedItems);
return view('partials.action', ['orderItems' => $decodedItems])->render();
})
->addColumn('status', function ($row) {
return view(
"partials.common",
[
'row' => $row,
'isOrderStatus' => 1,
]
)->render();
})
->addColumn('order_completed', function ($row) {
$order_completed = $row->order_completed; // Ensure this is defined
return view('partials.action', [
'currentRoute' => Auth::getDefaultDriver(),
'row' => $row,
'order_completed' => $order_completed,
])->render();
})
->addColumn('estimated_arival_time', function ($row) {
$estimated_arival_time = $row->estimated_arival_time ?? '0'; // Ensure this is defined
return view('partials.action', [
'currentRoute' => Auth::getDefaultDriver(),
'row' => $row,
'estimated_arival_time' => $estimated_arival_time,
])->render();
})
->addColumn('action', function ($row) {
return view(
"partials.action",
[
'currentRoute' => Auth::getDefaultDriver() . '.order-history',
'row' => $row,
'isDelete' => 0,
'isView' => 1,
'isEdit' => 0,
]
)->render();
})
->rawColumns(['status', 'action', 'order_item_array', 'order_completed'])
->toJson();
}
public function detailsData($request)
{
$orderId = $request->order != null ? decrypt($request->order) : '';
$data = $this->model->select('order_item_array');
if ($orderId) {
$data->where('id', $orderId);
}
$detailsData = $data->first();
// $detailsData = json_decode($detailsData->order_item_array, true);
$detailsData = json_decode($detailsData->order_item_array);
return DataTables::of($detailsData)
->addIndexColumn()
->addColumn('item_image', function ($row) {
return view(
"partials.common",
[
"isProfile" => 1,
// "image" => $row['item_image']
"image" => $row->item_image
]
)->render();
})
->editColumn('item_name', function ($row) {
// if (empty($row['item_name'])) {
if (empty($row->item_name)) {
return '-';
} else {
// return $row['item_name'];
return $row->item_name;
}
})
->editColumn('item_category', function ($row) {
// if (empty($row['item_category'])) {
if (empty($row->item_category)) {
return '-';
} else {
// return $row['item_category'];
return $row->item_category;
}
})
->addColumn('item_amount', function ($row) {
// if (empty($row['item_amount'])) {
if (empty($row->item_amount)) {
return '-';
} else {
// return '£ ' . $row['item_amount'];
return '£ ' . $row->item_amount;
}
})
->addColumn('item_description', function ($row) {
// if (empty($row['item_description'])) {
if (empty($row->item_description)) {
return '-';
} else {
// return $row['item_description'];
return $row->item_description;
}
})
->addColumn('item_type', function ($row) {
// if (empty($row['item_type'])) {
if (empty($row->item_type)) {
return '-';
} else {
// return $row['item_type'];
return $row->item_type;
}
})
->addColumn('item_size', function ($row) {
// if (empty($row['item_size'])) {
if (empty($row->item_size)) {
return '-';
} else {
// return $row['item_size'];
return $row->item_size;
}
})
->addColumn('item_quantity', function ($row) {
// if (empty($row['item_quantity'])) {
if (empty($row->item_quantity)) {
return '-';
} else {
// return $row['item_quantity'];
return $row->item_quantity;
}
})
->addColumn('is_suggested_item', function ($row) {
// if ($row['is_suggested_item'] == 0) {
if ($row->is_suggested_item == 0) {
return 'No';
} else {
return 'Yes';
}
})
->addColumn('addons', function ($row) {
if (!empty($row->addon_sizes) && is_array($row->addon_sizes)) {
return implode(', ', array_map(function ($addon) {
$addonItem = $addon->addon_size_name . '(' . $addon->addon_size_price . ')';
return $addonItem; // Display addon size name
}, $row->addon_sizes));
}
return '-';
})
->rawColumns(['item_image'])
->toJson();
}
public function changeOrderCompleted($request)
{
try {
$validatedData = $request->validate([
'id' => 'required|integer|exists:orders,id',
'status' => 'required|boolean',
]);
$order = Order::findOrFail($validatedData['id']);
$order->order_completed = $validatedData['status'];
$order->save();
return response()->json([
'success' => true,
'message' => 'Order completed status updated successfully.',
'data' => ['id' => $validatedData['id'], 'status' => $validatedData['status']],
]);
} catch (\Illuminate\Validation\ValidationException $e) {
return response()->json([
'success' => false,
'message' => 'Validation failed',
'errors' => $e->errors(),
], 422);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'An error occurred while updating the order.',
], 500);
}
}
}