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