HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-10-0-8-47 6.8.0-1021-aws #23~22.04.1-Ubuntu SMP Tue Dec 10 16:31:58 UTC 2024 aarch64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.22
Disabled: NONE
Upload Files
File: /var/www/admin.javaapp.co.uk/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')->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('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);

        }

    }
}