/home2/mshostin/carnival.ms-hostingladz.com/app/Http/Controllers/OrderController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf;
use App\Models\Order;
use App\Models\OrderShipping;
use App\Models\OrdersBilling;
use App\Models\Product;
use App\Models\User;
use Illuminate\Validation\Rule;
use App\Models\Cart;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\PaymentController;
class OrderController extends Controller
{
public function index(Request $request)
{
/** @var \App\Models\User|null $user */
$user = Auth::user();
$query = Order::with(['user', 'items.product', 'items.event.tickets', 'items.music', 'items.costume'])->latest();
// If not admin → restrict orders to vendor’s products
if (!$user->isAdmin()) {
$query->whereHas('items.product', function ($q) use ($user) {
$q->where('user_id', $user->id);
});
}
// --- Filters ---
if ($request->filled('search')) {
$search = $request->search;
$query->where(function ($q) use ($search) {
$q->where('order_num', 'like', "%{$search}%")
->orWhereHas('user', function ($sub) use ($search) {
$sub->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%");
});
});
}
if ($request->filled('payment')) {
$query->where('payment_method', $request->payment);
}
if ($request->filled('status')) {
$query->where('status', $request->status);
}
if ($request->filled('date_from')) {
$query->whereDate('created_at', '>=', $request->date_from);
}
if ($request->filled('date_to')) {
$query->whereDate('created_at', '<=', $request->date_to);
}
if (!$user->isAdmin()) {
$query->whereHas('items', function ($q) use ($user) {
$q->where(function ($sub) use ($user) {
$sub->whereHas('product', fn($q) => $q->where('user_id', $user->id))
->orWhereHas('event', fn($q) => $q->where('user_id', $user->id))
->orWhereHas('music', fn($q) => $q->where('user_id', $user->id))
->orWhereHas('costume', fn($q) => $q->where('user_id', $user->id));
});
});
}
// --- Pagination ---
$orders = $query->paginate(10);
// --- AJAX check ---
if ($request->ajax()) {
return view('dashboard.admin.orders.partials.order_table', compact('orders'))->render();
}
return view('dashboard.admin.orders.index', compact('orders'));
}
public function store(Request $request)
{
$user_id = Auth::id();
$cartItems = Cart::with(['product', 'event', 'music'])->where('user_id', $user_id)->get();
if ($cartItems->isEmpty()) {
return response()->json(['error' => 'Cart is empty'], 400);
}
// ✅ Calculate total dynamically based on type
$total = 0;
foreach ($cartItems as $cartItem) {
$price = 0;
if ($cartItem->type === 'product' && $cartItem->product) {
$price = $cartItem->product->new_price;
} elseif ($cartItem->type === 'event' && $cartItem->event) {
$price = $cartItem->event->price;
} elseif ($cartItem->type === 'music' && $cartItem->music) {
$price = $cartItem->music->price;
}
$total += $price * $cartItem->quantity;
}
// ✅ Create the order
$order = Order::create([
'user_id' => $user_id,
'order_num' => $this->generateOrderNumber(),
'shipping_price' => $request->shipping_price,
'payment_method' => $request->payment_method,
'total_amount' => $total,
]);
// ✅ Save billing
OrdersBilling::create([
'order_id' => $order->id,
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'company_name' => $request->company_name,
'address' => $request->address,
'email_address' => $request->email_address,
'city' => $request->city,
'state' => $request->state,
'postal_code' => $request->postal_code,
'country' => $request->country,
'telephone' => $request->telephone,
'fax' => $request->fax,
]);
// ✅ Save shipping
OrderShipping::create([
'order_id' => $order->id,
'first_name_1' => $request->first_name_1,
'last_name_1' => $request->last_name_1,
'company_name_1' => $request->company_name_1,
'email_address_1' => $request->email_address_1,
'address_1' => $request->address_1,
'city_1' => $request->city_1,
'state1' => $request->state1,
'postal_code_1' => $request->postal_code_1,
'country1' => $request->country1,
'telephone_1' => $request->telephone_1,
'fax_1' => $request->fax_1,
]);
// ✅ Save order items dynamically
foreach ($cartItems as $cartItem) {
$price = 0;
if ($cartItem->type === 'product' && $cartItem->product) {
$price = $cartItem->product->new_price;
} elseif ($cartItem->type === 'event' && $cartItem->event) {
$price = $cartItem->event->price;
} elseif ($cartItem->type === 'music' && $cartItem->music) {
$price = $cartItem->music->price;
}
$order->items()->create([
'product_id' => $cartItem->product_id,
'type' => $cartItem->type,
'quantity' => $cartItem->quantity,
'price' => $price ?? 0,
]);
}
// ✅ Handle Stripe payment if payment method is 'card'
if ($request->payment_method === 'card') {
$paymentController = new PaymentController();
$request->merge([
'order_id' => $order->id,
'stripeToken' => $request->stripeToken,
]);
return $paymentController->splitPayment($request);
}
// ✅ Clear cart
Cart::where('user_id', $user_id)->delete();
return response()->json(['message' => 'Order created successfully', 'total' => $total]);
}
// public function store(Request $request)
// {
// $user_id = Auth::id();
// $cartItems = Cart::with('product')->where('user_id', $user_id)->get();
// if ($cartItems->isEmpty()) {
// return response()->json(['error' => 'Cart is empty'], 400);
// }
// $total = 0;
// foreach ($cartItems as $cartItem) {
// $total += $cartItem->product->new_price * $cartItem->quantity;
// }
// $order = Order::create([
// 'user_id' => $user_id,
// 'order_num' => $this->generateOrderNumber(),
// 'shipping_price' => $request->shipping_price,
// 'payment_method' => $request->payment_method,
// 'total_amount' => $total, // Set the total amount
// ]);
// $billing_data = [
// 'order_id' => $order->id,
// 'first_name' => $request->first_name,
// 'last_name' => $request->last_name,
// 'company_name' => $request->company_name,
// 'address' => $request->address,
// 'email_address' => $request->email_address,
// 'city' => $request->city,
// 'state' => $request->state,
// 'postal_code' => $request->postal_code,
// 'country' => $request->country,
// 'telephone' => $request->telephone,
// 'fax' => $request->fax,
// ];
// $order_billing = OrdersBilling::create($billing_data);
// $shipping_data = [
// 'order_id' => $order->id,
// 'first_name_1' => $request->first_name_1,
// 'last_name_1' => $request->last_name_1,
// 'company_name_1' => $request->company_name_1,
// 'email_address_1' => $request->email_address_1,
// 'address_1' => $request->address_1,
// 'city_1' => $request->city_1,
// 'state1' => $request->state1,
// 'postal_code_1' => $request->postal_code_1,
// 'country1' => $request->country1,
// 'telephone_1' => $request->telephone_1,
// 'fax_1' => $request->fax_1,
// ];
// $order_shipping = OrderShipping::create($shipping_data);
// foreach ($cartItems as $cartItem) {
// $order->items()->create([
// 'product_id' => $cartItem->product_id,
// 'quantity' => $cartItem->quantity,
// 'price' => $cartItem->product->new_price,
// ]);
// }
// Cart::where('user_id', $user_id)->delete();
// return response()->json(['message' => 'Order created successfully', 'total' => $total]);
// }
public function show(Order $order)
{
$order->load([
'user',
'items.product.category',
'items.product.subcategory',
'items.product.brand',
'items.product.features',
'items.product.variants',
'items.product.product_images',
'shipping',
'billing',
]);
return view('dashboard.admin.orders.show', compact('order'));
}
public function generateOrderNumber()
{
$today = now()->format('mdY');
do {
$countToday = Order::whereDate('created_at', now()->toDateString())->count() + 1;
$orderNumber = 'ORD-' . $today . '-' . str_pad($countToday, 4, '0', STR_PAD_LEFT);
} while (Order::where('order_num', $orderNumber)->exists());
return $orderNumber;
}
public function invoice($id)
{
$order = Order::with([
'user',
'items.product',
'shipping',
'billing'
])->findOrFail($id);
return view('dashboard.admin.orders.invoice', compact('order'));
}
public function invoicePdf($id)
{
$order = Order::with([
'user',
'items.product',
'shipping',
'billing'
])->findOrFail($id);
$pdf = Pdf::setOptions(['isRemoteEnabled' => true])
->loadView('dashboard.admin.orders.invoice', compact('order'));
return $pdf->download("invoice-{$order->order_num}.pdf");
}
}