Files
ABSDEV/Modules/Commerce/Http/Controllers/CommerceController.php
T
Mark Gregory 86f2bc75aa Commerce administration dashboard
* Product catalogue
* Product categories
* Physical, digital, service, and bundle product types
* Product variants and option storage
* SKU management
* Product publishing states
* Pricing and comparison pricing
* Inventory quantities
* Low-stock thresholds
* Inventory movement history
* Customer records and addresses
* Orders and order items
* Payment and fulfilment statuses
* Payment transaction storage
* Promotions and coupon codes
* Shipping methods
* Tax rates
* Payment, shipping, tax, and inventory provider contracts
* Default manual payment provider
* Default flat-rate shipping provider
* Public product REST API
* Administration navigation
* Commerce permissions
* Module registration
* Module boot tests
2026-07-24 12:24:12 +01:00

24 lines
2.5 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.'); }
}