
PK 
<?php
namespace App\Http\Controllers;
use App\Mail\OrderPlaced;
use Illuminate\Support\Facades\Mail;
use Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Models\Cart;
use App\Models\Order;
use App\Models\Shipping;
use App\Models\ShippingAddress;
use App\User;
use PDF;
use Notification;
use Helper;
use Illuminate\Support\Str;
use App\Notifications\StatusNotification;
class OrderController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$orders=Order::orderBy('id','DESC')->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.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
/*public function store(Request $request)
{
// Validation
$rules = [
'payment_method' => 'required',
];
if (!$request->filled('saved_address_id')) {
$rules = array_merge($rules, [
'first_name' => 'required|string',
'address1' => 'required|string',
'phone' => 'required|numeric|digits:10',
'country' => 'required|string',
'post_code' => 'required|digits:6'
]);
}
$validatedData = $request->validate($rules);
// Check if cart is empty
if (!Cart::where('user_id', auth()->id())->whereNull('order_id')->exists()) {
return $request->ajax()
? response()->json(['error' => 'Cart is Empty!'], 400)
: back()->with('error', 'Cart is Empty!');
}
$user = auth()->user();
$cartTotal = Helper::totalCartPrice();
$shippingCharge = ($cartTotal < 500) ? 100 : 0;
$couponValue = session('coupon')['value'] ?? 0;
$totalAmount = $cartTotal + $shippingCharge - $couponValue;
// Determine address
$shippingData = [];
if ($request->filled('saved_address_id')) {
$savedAddress = ShippingAddress::where('user_id', $user->id)
->find($request->saved_address_id);
if (!$savedAddress) {
return $request->ajax()
? response()->json(['error' => 'Invalid shipping address selected.'], 400)
: back()->with('error', 'Invalid shipping address selected.');
}
$shippingData = $savedAddress->toArray();
} else {
// For new addresses submitted during checkout
$shippingData = [
'first_name' => $validatedData['first_name'],
'email' => $user->email, // Use user's email
'phone' => $validatedData['phone'],
'country' => $validatedData['country'],
'address1' => $validatedData['address1'],
'address2' => $request->input('address2'),
'post_code' => $validatedData['post_code']
];
}
// Start transaction
DB::beginTransaction();
try {
$orderData = [
'order_number' => 'ORD-' . strtoupper(Str::random(10)),
'user_id' => $user->id,
'shipping_id' => null,
'shipping_charge' => $shippingCharge,
'sub_total' => $cartTotal,
'quantity' => Helper::cartCount(),
'coupon' => $couponValue,
'total_amount' => $totalAmount,
'status' => 'new',
'payment_method' => $request->payment_method == 'paypal' ? 'paypal' : 'cod',
'payment_status' => $request->payment_method == 'paypal' ? 'paid' : 'Unpaid',
'first_name' => $shippingData['first_name'],
'email' => $shippingData['email'],
'phone' => $shippingData['phone'],
'country' => $shippingData['country'],
'address1' => $shippingData['address1'],
'address2' => $shippingData['address2'] ?? null,
'post_code' => $shippingData['post_code'] ?? null,
];
$order = Order::create($orderData);
// Process cart items
$carts = Cart::where('user_id', auth()->id())->whereNull('order_id')->get();
foreach ($carts as $cart) {
$product = $cart->product;
if ($product->stock < $cart->quantity) {
throw new \Exception("Not enough stock for product: {$product->title}");
}
$product->stock -= $cart->quantity;
$product->sold_qty += $cart->quantity;
$product->save();
$cart->order_id = $order->id;
$cart->save();
}
DB::commit();
// ... existing notification and email logic ...
// Notify admin
if ($admin = User::where('role', 'admin')->first()) {
$admin->notify(new StatusNotification([
'title' => 'New order created',
'actionURL' => route('order.show', $order->id),
'fas' => 'fa-file-alt'
]));
}
// Send order email
Mail::to($order->email)
->bcc('indusinfotek.vinay@gmail.com')
->send(new OrderPlaced($order));
// Clear session
session()->forget(['cart', 'coupon']);
// For AJAX requests (like PayPal)
if ($request->ajax()) {
return response()->json([
'redirect' => $request->payment_method == 'paypal'
? route('payment')
: route('home')
]);
}
// For normal form submissions
if ($request->payment_method == 'paypal') {
return redirect()->route('payment')->with(['id' => $order->id]);
}
return redirect()->route('home')->with('success', 'Order placed successfully!');
} catch (\Exception $e) {
DB::rollBack();
if ($request->ajax()) {
return response()->json(['error' => $e->getMessage()], 500);
}
return back()->with('error', $e->getMessage());
}
}*/
public function store(Request $request)
{
// Validation
$rules = [
'payment_method' => 'required',
];
// Check if cart is empty
if (!Cart::where('user_id', auth()->id())->whereNull('order_id')->exists()) {
return $request->ajax()
? response()->json(['error' => 'Cart is Empty!'], 400)
: back()->with('error', 'Cart is Empty!');
}
$user = auth()->user();
$cartTotal = Helper::totalCartPrice();
$shippingCharge = ($cartTotal < 500) ? 100 : 0;
$couponValue = session('coupon')['value'] ?? 0;
$totalAmount = $cartTotal + $shippingCharge - $couponValue;
// Determine address
$shippingData = [];
if ($request->filled('saved_address_id')) {
$savedAddress = ShippingAddress::where('user_id', $user->id)
->find($request->saved_address_id);
if (!$savedAddress) {
return $request->ajax()
? response()->json(['error' => 'Invalid shipping address selected.'], 400)
: back()->with('error', 'Invalid shipping address selected.');
}
$shippingData = $savedAddress->toArray();
}
// Start transaction
DB::beginTransaction();
try {
$orderData = [
'order_number' => 'ORD-' . strtoupper(Str::random(10)),
'user_id' => $user->id,
'shipping_id' => null,
'shipping_charge' => $shippingCharge,
'sub_total' => $cartTotal,
'quantity' => Helper::cartCount(),
'coupon' => $couponValue,
'total_amount' => $totalAmount,
'status' => 'new',
'payment_method' => $request->payment_method == 'paypal' ? 'paypal' : 'cod',
'payment_status' => $request->payment_method == 'paypal' ? 'paid' : 'Unpaid',
'first_name' => $shippingData['first_name'],
'email' => $shippingData['email'],
'phone' => $shippingData['phone'],
'country' => $shippingData['country'],
'address1' => $shippingData['address1'],
'address2' => $shippingData['address2'] ?? null,
'post_code' => $shippingData['post_code'] ?? null,
];
$order = Order::create($orderData);
// Process cart items
$carts = Cart::where('user_id', auth()->id())->whereNull('order_id')->get();
foreach ($carts as $cart) {
$product = $cart->product;
if ($product->stock < $cart->quantity) {
throw new \Exception("Not enough stock for product: {$product->title}");
}
$product->stock -= $cart->quantity;
$product->sold_qty += $cart->quantity;
$product->save();
$cart->order_id = $order->id;
$cart->save();
}
DB::commit();
// ... existing notification and email logic ...
// Notify admin
if ($admin = User::where('role', 'admin')->first()) {
$admin->notify(new StatusNotification([
'title' => 'New order created',
'actionURL' => route('order.show', $order->id),
'fas' => 'fa-file-alt'
]));
}
// Send order email
Mail::to($order->email)
->bcc('indusinfotek.vinay@gmail.com')
->send(new OrderPlaced($order));
// Clear session
session()->forget(['cart', 'coupon']);
// For AJAX requests (like PayPal)
if ($request->ajax()) {
return response()->json([
'redirect' => $request->payment_method == 'paypal'
? route('payment')
: route('home')
]);
}
// For normal form submissions
if ($request->payment_method == 'paypal') {
return redirect()->route('payment')->with(['id' => $order->id]);
}
return redirect()->route('home')->with('success', 'Order placed successfully!');
} catch (\Exception $e) {
DB::rollBack();
if ($request->ajax()) {
return response()->json(['error' => $e->getMessage()], 500);
}
return back()->with('error', $e->getMessage());
}
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$order=Order::find($id);
// return $order;
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::find($id);
return view('backend.order.edit')->with('order',$order);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$order=Order::find($id);
$this->validate($request,[
'status'=>'required|in:new,process,delivered,cancel'
]);
$data=$request->all();
// return $request->status;
if($request->status=='delivered'){
foreach($order->cart as $cart){
$product=$cart->product;
// return $product;
$product->stock -=$cart->quantity;
$product->save();
}
}
$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');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$order=Order::find($id);
if($order){
$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()->user()->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::getAllOrder($request->id);
// return $order;
$file_name=$order->order_number.'-'.$order->first_name.'.pdf';
// return $file_name;
$pdf=PDF::loadview('backend.order.pdf',compact('order'));
return $pdf->download($file_name);
}
// 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=intval($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;
}
}


PK 99