message
This commit is contained in:
@@ -5,74 +5,198 @@ namespace App\Http\Controllers\Admin;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Order;
|
||||
use App\Models\MarkList; // ✅ Correct model
|
||||
use App\Models\OrderItem;
|
||||
use App\Models\MarkList;
|
||||
|
||||
class AdminOrderController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$orders = Order::latest()->get();
|
||||
$markList = MarkList::where('status', 'active')->get(); // ✅ Correct usage
|
||||
$markList = MarkList::where('status', 'active')->get();
|
||||
|
||||
return view('admin.dashboard', compact('orders', 'markList'));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'mark_no' => 'required',
|
||||
'description' => 'required',
|
||||
]);
|
||||
// -------------------------------------------------------------------------
|
||||
// STEP 1 : ADD TEMPORARY ITEM
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
// ✅ Generate custom order_id like KNT-25-00000001
|
||||
$year = date('y');
|
||||
$prefix = "KNT-$year-";
|
||||
public function addTempItem(Request $request)
|
||||
{
|
||||
// Validate item fields
|
||||
$item = $request->validate([
|
||||
'mark_no' => 'required',
|
||||
'origin' => 'required',
|
||||
'destination' => 'required',
|
||||
'description' => 'required|string',
|
||||
'ctn' => 'nullable|numeric',
|
||||
'qty' => 'nullable|numeric',
|
||||
'ttl_qty' => 'nullable|numeric',
|
||||
'unit' => 'nullable|string',
|
||||
'price' => 'nullable|numeric',
|
||||
'ttl_amount' => 'nullable|numeric',
|
||||
'cbm' => 'nullable|numeric',
|
||||
'ttl_cbm' => 'nullable|numeric',
|
||||
'kg' => 'nullable|numeric',
|
||||
'ttl_kg' => 'nullable|numeric',
|
||||
'shop_no' => 'nullable|string',
|
||||
]);
|
||||
|
||||
// Get the last order to increment number
|
||||
$lastOrder = Order::latest('id')->first();
|
||||
$nextNumber = $lastOrder ? intval(substr($lastOrder->order_id, -8)) + 1 : 1;
|
||||
// ❌ Prevent changing mark_no once first item added
|
||||
if (session()->has('mark_no') && session('mark_no') != $request->mark_no) {
|
||||
return redirect()->to(route('admin.orders.index') . '#createOrderForm')
|
||||
->with('error', 'You must finish or clear the current order before changing Mark No.');
|
||||
}
|
||||
|
||||
// Format number with leading zeros (8 digits)
|
||||
$newOrderId = $prefix . str_pad($nextNumber, 8, '0', STR_PAD_LEFT);
|
||||
// Save mark, origin, destination ONLY ONCE
|
||||
if (!session()->has('mark_no')) {
|
||||
session([
|
||||
'mark_no' => $request->mark_no,
|
||||
'origin' => $request->origin,
|
||||
'destination' => $request->destination
|
||||
]);
|
||||
}
|
||||
|
||||
// ✅ Create order
|
||||
$order = new Order();
|
||||
$order->order_id = $newOrderId; // ✅ set this field
|
||||
$order->mark_no = $request->mark_no;
|
||||
$order->origin = $request->origin;
|
||||
$order->destination = $request->destination;
|
||||
$order->description = $request->description;
|
||||
$order->ctn = $request->ctn;
|
||||
$order->qty = $request->qty;
|
||||
$order->ttl_qty = $request->ttl_qty;
|
||||
$order->unit = $request->unit;
|
||||
$order->price = $request->price;
|
||||
$order->ttl_amount = $request->ttl_amount;
|
||||
$order->cbm = $request->cbm;
|
||||
$order->ttl_cbm = $request->ttl_cbm;
|
||||
$order->kg = $request->kg;
|
||||
$order->ttl_kg = $request->ttl_kg;
|
||||
$order->shop_no = $request->shop_no;
|
||||
$order->status = 'pending';
|
||||
$order->save();
|
||||
// ❌ DO NOT overwrite these values again
|
||||
// session(['mark_no' => $request->mark_no]);
|
||||
// session(['origin' => $request->origin]);
|
||||
// session(['destination' => $request->destination]);
|
||||
|
||||
return redirect()->back()->with('success', 'Order created successfully with ID: ' . $newOrderId);
|
||||
}
|
||||
// Add new sub-item into session
|
||||
session()->push('temp_order_items', $item);
|
||||
|
||||
return redirect()->to(route('admin.orders.index') . '#createOrderForm')
|
||||
->with('success', 'Item added.');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// STEP 2 : DELETE TEMPORARY ITEM
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function deleteTempItem(Request $request)
|
||||
{
|
||||
$index = $request->index;
|
||||
|
||||
$items = session('temp_order_items', []);
|
||||
|
||||
if (isset($items[$index])) {
|
||||
unset($items[$index]);
|
||||
session(['temp_order_items' => array_values($items)]);
|
||||
}
|
||||
|
||||
// If no items left → reset mark_no lock
|
||||
if (empty($items)) {
|
||||
session()->forget(['mark_no', 'origin', 'destination']);
|
||||
}
|
||||
|
||||
return redirect()->to(route('admin.orders.index') . '#createOrderForm')
|
||||
->with('success', 'Item removed successfully.');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// STEP 3 : FINISH ORDER
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function finishOrder(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'mark_no' => 'required',
|
||||
'origin' => 'required',
|
||||
'destination' => 'required',
|
||||
]);
|
||||
|
||||
$items = session('temp_order_items', []);
|
||||
|
||||
if (empty($items)) {
|
||||
return redirect()->to(route('admin.orders.index') . '#createOrderForm')
|
||||
->with('error', 'Add at least one item before finishing.');
|
||||
}
|
||||
|
||||
// Generate Order ID
|
||||
$year = date('y');
|
||||
$prefix = "KNT-$year-";
|
||||
|
||||
$lastOrder = Order::latest('id')->first();
|
||||
$nextNumber = $lastOrder ? intval(substr($lastOrder->order_id, -8)) + 1 : 1;
|
||||
|
||||
$orderId = $prefix . str_pad($nextNumber, 8, '0', STR_PAD_LEFT);
|
||||
|
||||
// TOTAL SUMS
|
||||
$total_ctn = array_sum(array_column($items, 'ctn'));
|
||||
$total_qty = array_sum(array_column($items, 'qty'));
|
||||
$total_ttl_qty = array_sum(array_column($items, 'ttl_qty'));
|
||||
$total_amount = array_sum(array_column($items, 'ttl_amount'));
|
||||
$total_cbm = array_sum(array_column($items, 'cbm'));
|
||||
$total_ttl_cbm = array_sum(array_column($items, 'ttl_cbm'));
|
||||
$total_kg = array_sum(array_column($items, 'kg'));
|
||||
$total_ttl_kg = array_sum(array_column($items, 'ttl_kg'));
|
||||
|
||||
// CREATE ORDER
|
||||
$order = Order::create([
|
||||
'order_id' => $orderId,
|
||||
'mark_no' => $request->mark_no,
|
||||
'origin' => $request->origin,
|
||||
'destination' => $request->destination,
|
||||
'ctn' => $total_ctn,
|
||||
'qty' => $total_qty,
|
||||
'ttl_qty' => $total_ttl_qty,
|
||||
'ttl_amount' => $total_amount,
|
||||
'cbm' => $total_cbm,
|
||||
'ttl_cbm' => $total_ttl_cbm,
|
||||
'kg' => $total_kg,
|
||||
'ttl_kg' => $total_ttl_kg,
|
||||
'status' => 'pending',
|
||||
]);
|
||||
|
||||
// SAVE ALL SUB-ITEMS
|
||||
foreach ($items as $item) {
|
||||
OrderItem::create([
|
||||
'order_id' => $order->id,
|
||||
'description' => $item['description'],
|
||||
'ctn' => $item['ctn'],
|
||||
'qty' => $item['qty'],
|
||||
'ttl_qty' => $item['ttl_qty'],
|
||||
'unit' => $item['unit'],
|
||||
'price' => $item['price'],
|
||||
'ttl_amount' => $item['ttl_amount'],
|
||||
'cbm' => $item['cbm'],
|
||||
'ttl_cbm' => $item['ttl_cbm'],
|
||||
'kg' => $item['kg'],
|
||||
'ttl_kg' => $item['ttl_kg'],
|
||||
'shop_no' => $item['shop_no'],
|
||||
]);
|
||||
}
|
||||
|
||||
// CLEAR TEMP DATA
|
||||
session()->forget(['temp_order_items', 'mark_no', 'origin', 'destination']);
|
||||
|
||||
return redirect()->route('admin.orders.index')
|
||||
->with('success', 'Order saved successfully.');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// ORDER SHOW PAGE
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$order = Order::with('markList')->findOrFail($id);
|
||||
$order = Order::with('items', 'markList')->findOrFail($id);
|
||||
|
||||
// Get the mark list associated with this order
|
||||
$markList = $order->markList;
|
||||
|
||||
// Fetch the user using the customer_id from mark list
|
||||
$user = null;
|
||||
if ($markList && $markList->customer_id) {
|
||||
$user = \App\Models\User::where('customer_id', $markList->customer_id)->first();
|
||||
if ($order->markList && $order->markList->customer_id) {
|
||||
$user = \App\Models\User::where('customer_id', $order->markList->customer_id)->first();
|
||||
}
|
||||
|
||||
return view('admin.orders_show', compact('order', 'markList', 'user'));
|
||||
return view('admin.orders_show', compact('order', 'user'));
|
||||
}
|
||||
|
||||
public function resetTemp()
|
||||
{
|
||||
session()->forget(['temp_order_items', 'mark_no', 'origin', 'destination']);
|
||||
|
||||
return redirect()->to(route('admin.orders.index') . '#createOrderForm')
|
||||
->with('success', 'Order reset successfully.');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,19 +4,37 @@ namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use App\Models\MarkList;
|
||||
|
||||
class Order extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'order_id', 'mark_no', 'description', 'origin', 'destination',
|
||||
'ctn', 'qty', 'ttl_qty', 'unit', 'price', 'ttl_amount',
|
||||
'cbm', 'ttl_cbm', 'kg', 'ttl_kg', 'shop_no', 'status'
|
||||
'order_id',
|
||||
'mark_no',
|
||||
'origin',
|
||||
'destination',
|
||||
|
||||
// totals only
|
||||
'ctn',
|
||||
'qty',
|
||||
'ttl_qty',
|
||||
'ttl_amount',
|
||||
'cbm',
|
||||
'ttl_cbm',
|
||||
'kg',
|
||||
'ttl_kg',
|
||||
|
||||
'status'
|
||||
];
|
||||
|
||||
// Relation using mark_no instead of id
|
||||
// One order has many items
|
||||
public function items()
|
||||
{
|
||||
return $this->hasMany(OrderItem::class);
|
||||
}
|
||||
|
||||
// Link using mark_no (optional)
|
||||
public function markList()
|
||||
{
|
||||
return $this->hasOne(MarkList::class, 'mark_no', 'mark_no');
|
||||
|
||||
38
app/Models/OrderItem.php
Normal file
38
app/Models/OrderItem.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class OrderItem extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'order_id',
|
||||
'description',
|
||||
'ctn',
|
||||
'qty',
|
||||
'ttl_qty',
|
||||
'unit',
|
||||
'price',
|
||||
'ttl_amount',
|
||||
'cbm',
|
||||
'ttl_cbm',
|
||||
'kg',
|
||||
'ttl_kg',
|
||||
'shop_no',
|
||||
'meta',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'meta' => 'array',
|
||||
];
|
||||
|
||||
// Link to parent order
|
||||
public function order()
|
||||
{
|
||||
return $this->belongsTo(Order::class);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user