54 lines
2.8 KiB
PHP
54 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace Modules\Commerce\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\View\View;
|
|
use Modules\Commerce\Models\Customer;
|
|
use Modules\Commerce\Models\Order;
|
|
use Modules\Commerce\Models\Product;
|
|
use Modules\Commerce\Models\Promotion;
|
|
|
|
final class CommerceController extends Controller
|
|
{
|
|
public function index(): View
|
|
{
|
|
return view('commerce::admin.index', ['products' => Product::latest()->paginate(20), 'orders' => Order::latest()->limit(10)->get(), 'revenue' => Order::where('payment_status', 'paid')->sum('grand_total'), 'lowStock' => Product::where('track_inventory', true)->whereColumn('stock_quantity', '<=', 'low_stock_threshold')->count(), 'customers' => Customer::count(), 'promotions' => Promotion::where('is_active', true)->count()]);
|
|
}
|
|
|
|
public function storeProduct(Request $request): RedirectResponse
|
|
{
|
|
$data = $request->validate(['name' => ['required', 'string', 'max:255'], 'slug' => ['nullable', 'string', 'max:255', 'unique:commerce_products,slug'], 'sku' => ['nullable', 'string', 'max:120', 'unique:commerce_products,sku'], 'type' => ['required', 'in:physical,digital,service,bundle'], 'summary' => ['nullable', 'string'], 'description' => ['nullable', 'string'], 'price' => ['required', 'numeric', 'min:0'], 'stock_quantity' => ['required', 'integer'], 'status' => ['required', 'in:draft,active,archived']]);
|
|
$data['slug'] = $data['slug'] ?: Str::slug($data['name']);
|
|
$data['currency'] = config('commerce.currency', 'GBP');
|
|
$data['published_at'] = $data['status'] === 'active' ? now() : null;
|
|
Product::create($data);
|
|
|
|
return back()->with('status', 'Product created.');
|
|
}
|
|
|
|
public function updateProduct(Request $request, Product $product): RedirectResponse
|
|
{
|
|
$product->update($request->validate(['name' => ['required', 'string', 'max:255'], 'price' => ['required', 'numeric', 'min:0'], 'stock_quantity' => ['required', 'integer'], 'status' => ['required', 'in:draft,active,archived']]));
|
|
|
|
return back()->with('status', 'Product updated.');
|
|
}
|
|
|
|
public function destroyProduct(Product $product): RedirectResponse
|
|
{
|
|
$product->delete();
|
|
|
|
return back()->with('status', 'Product deleted.');
|
|
}
|
|
|
|
public function updateOrder(Request $request, Order $order): RedirectResponse
|
|
{
|
|
$order->update($request->validate(['status' => ['required', 'in:pending,processing,completed,cancelled,refunded'], 'payment_status' => ['required', 'in:unpaid,authorised,paid,partially_refunded,refunded,failed'], 'fulfilment_status' => ['required', 'in:unfulfilled,partial,fulfilled,returned']]));
|
|
|
|
return back()->with('status', 'Order updated.');
|
|
}
|
|
}
|