get(); $markList = MarkList::where('status', 'active')->get(); return view('admin.dashboard', compact('orders', 'markList')); } /* --------------------------- * CREATE NEW ORDER (simple page) * ---------------------------*/ public function create() { $markList = MarkList::where('status', 'active')->get(); return view('admin.orders_create', compact('markList')); } public function store(Request $request) { $data = $request->validate([ 'mark_no' => 'required|string', 'origin' => 'nullable|string', 'destination' => 'nullable|string', 'ctn' => 'nullable|numeric', 'qty' => 'nullable|numeric', 'ttl_qty' => 'nullable|numeric', 'ttl_amount' => 'nullable|numeric', 'cbm' => 'nullable|numeric', 'ttl_cbm' => 'nullable|numeric', 'kg' => 'nullable|numeric', 'ttl_kg' => 'nullable|numeric', ]); $order = Order::create([ 'order_id' => $this->generateOrderId(), 'mark_no' => $data['mark_no'], 'origin' => $data['origin'] ?? null, 'destination'=> $data['destination'] ?? null, 'ctn' => $data['ctn'] ?? 0, 'qty' => $data['qty'] ?? 0, 'ttl_qty' => $data['ttl_qty'] ?? 0, 'ttl_amount' => $data['ttl_amount'] ?? 0, 'cbm' => $data['cbm'] ?? 0, 'ttl_cbm' => $data['ttl_cbm'] ?? 0, 'kg' => $data['kg'] ?? 0, 'ttl_kg' => $data['ttl_kg'] ?? 0, 'status' => 'pending', ]); $this->createInvoice($order); return redirect()->route('admin.orders.show', $order->id) ->with('success', 'Order created successfully.'); } /* --------------------------- * SHOW / POPUP * ---------------------------*/ public function show($id) { $order = Order::with('items', 'markList')->findOrFail($id); $user = $this->getCustomerFromOrder($order); return view('admin.orders_show', compact('order', 'user')); } public function popup($id) { $order = Order::with(['items', 'markList'])->findOrFail($id); $user = null; if ($order->markList && $order->markList->customer_id) { $user = User::where('customer_id', $order->markList->customer_id)->first(); } return view('admin.popup', compact('order', 'user')); } /* --------------------------- * ORDER ITEM MANAGEMENT (existing orders) * ---------------------------*/ public function addItem(Request $request, $orderId) { $order = Order::findOrFail($orderId); $data = $request->validate([ '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', ]); $data['order_id'] = $order->id; OrderItem::create($data); $this->recalcTotals($order); $this->updateInvoiceFromOrder($order); return redirect()->back()->with('success', 'Item added and totals updated.'); } public function deleteItem($id) { $item = OrderItem::findOrFail($id); $order = $item->order; $item->delete(); $this->recalcTotals($order); $this->updateInvoiceFromOrder($order); return redirect()->back()->with('success', 'Item deleted and totals updated.'); } public function restoreItem($id) { $item = OrderItem::withTrashed()->findOrFail($id); $order = Order::findOrFail($item->order_id); $item->restore(); $this->recalcTotals($order); $this->updateInvoiceFromOrder($order); return redirect()->back()->with('success', 'Item restored and totals updated.'); } /* --------------------------- * ORDER CRUD: update / destroy * ---------------------------*/ public function update(Request $request, $id) { $order = Order::findOrFail($id); $data = $request->validate([ 'mark_no' => 'required|string', 'origin' => 'nullable|string', 'destination' => 'nullable|string', ]); $order->update([ 'mark_no' => $data['mark_no'], 'origin' => $data['origin'] ?? null, 'destination' => $data['destination'] ?? null, ]); $this->recalcTotals($order); return redirect()->route('admin.orders.show', $order->id) ->with('success', 'Order updated successfully.'); } public function destroy($id) { $order = Order::findOrFail($id); OrderItem::where('order_id', $order->id)->delete(); $order->delete(); return redirect()->route('admin.orders.index') ->with('success', 'Order deleted successfully.'); } /* --------------------------- * HELPERS * ---------------------------*/ private function recalcTotals(Order $order) { $items = $order->items()->get(); $order->update([ 'ctn' => (int) $items->sum(fn($i) => (int) ($i->ctn ?? 0)), 'qty' => (int) $items->sum(fn($i) => (int) ($i->qty ?? 0)), 'ttl_qty' => (int) $items->sum(fn($i) => (int) ($i->ttl_qty ?? 0)), 'ttl_amount' => (float) $items->sum(fn($i) => (float) ($i->ttl_amount ?? 0)), 'cbm' => (float) $items->sum(fn($i) => (float) ($i->cbm ?? 0)), 'ttl_cbm' => (float) $items->sum(fn($i) => (float) ($i->ttl_cbm ?? 0)), 'kg' => (float) $items->sum(fn($i) => (float) ($i->kg ?? 0)), 'ttl_kg' => (float) $items->sum(fn($i) => (float) ($i->ttl_kg ?? 0)), ]); } private function generateOrderId() { $year = date('y'); $prefix = "KNT-$year-"; $lastOrder = Order::latest('id')->first(); $nextNumber = $lastOrder ? intval(substr($lastOrder->order_id, -8)) + 1 : 1; return $prefix . str_pad($nextNumber, 8, '0', STR_PAD_LEFT); } /* --------------------------- * INVOICE CREATION HELPERS * ---------------------------*/ private function createInvoice(Order $order) { $invoiceNumber = $this->generateInvoiceNumber(); $customer = $this->getCustomerFromMarkList($order->mark_no); $totalAmount = $order->ttl_amount; $invoice = Invoice::create([ 'order_id' => $order->id, 'customer_id' => $customer->id ?? null, 'mark_no' => $order->mark_no, 'invoice_number' => $invoiceNumber, 'invoice_date' => now(), 'due_date' => now()->addDays(10), 'payment_method' => null, 'reference_no' => null, 'status' => 'pending', 'final_amount' => $totalAmount, 'gst_percent' => 0, 'gst_amount' => 0, 'final_amount_with_gst' => $totalAmount, 'customer_name' => $customer->customer_name ?? null, 'company_name' => $customer->company_name ?? null, 'customer_email' => $customer->email ?? null, 'customer_mobile' => $customer->mobile_no ?? null, 'customer_address' => $customer->address ?? null, 'pincode' => $customer->pincode ?? null, 'notes' => null, 'pdf_path' => null, ]); foreach ($order->items as $item) { InvoiceItem::create([ 'invoice_id' => $invoice->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, ]); } } private function generateInvoiceNumber() { $lastInvoice = Invoice::latest()->first(); $nextInvoice = $lastInvoice ? $lastInvoice->id + 1 : 1; return 'INV-' . date('Y') . '-' . str_pad($nextInvoice, 6, '0', STR_PAD_LEFT); } private function getCustomerFromMarkList($markNo) { $markList = MarkList::where('mark_no', $markNo)->first(); if ($markList && $markList->customer_id) { return User::where('customer_id', $markList->customer_id)->first(); } return null; } private function getCustomerFromOrder($order) { if ($order->markList && $order->markList->customer_id) { return User::where('customer_id', $order->markList->customer_id)->first(); } return null; } /* --------------------------- * SEE (detailed) * ---------------------------*/ public function see($id) { $order = Order::with([ 'markList', 'items', 'invoice.items', 'shipments' => function ($q) use ($id) { $q->whereHas('orders', function ($oq) use ($id) { $oq->where('orders.id', $id) ->whereNull('orders.deleted_at'); })->with([ 'orders' => function ($oq) use ($id) { $oq->where('orders.id', $id) ->whereNull('orders.deleted_at') ->with('items'); } ]); } ])->findOrFail($id); $orderData = [ 'order_id' => $order->order_id, 'status' => $order->status, 'totals' => [ 'ctn' => $order->ctn, 'qty' => $order->qty, 'ttl_qty' => $order->ttl_qty, 'cbm' => $order->cbm, 'ttl_cbm' => $order->ttl_cbm, 'kg' => $order->kg, 'ttl_kg' => $order->ttl_kg, 'amount' => $order->ttl_amount, ], 'items' => $order->items, ]; $shipmentsData = []; foreach ($order->shipments as $shipment) { $shipmentOrders = []; $totals = [ 'ctn' => 0, 'qty' => 0, 'ttl_qty' => 0, 'cbm' => 0, 'ttl_cbm' => 0, 'kg' => 0, 'ttl_kg' => 0, 'amount' => 0, ]; foreach ($shipment->orders as $shipOrder) { foreach ($shipOrder->items as $item) { $shipmentOrders[] = [ 'order_id' => $shipOrder->order_id, 'origin' => $shipOrder->origin, 'destination' => $shipOrder->destination, 'description' => $item->description, 'ctn' => $item->ctn, 'qty' => $item->qty, 'ttl_qty' => $item->ttl_qty, 'amount' => $item->ttl_amount, ]; $totals['ctn'] += $item->ctn; $totals['qty'] += $item->qty; $totals['ttl_qty'] += $item->ttl_qty; $totals['cbm'] += $item->cbm; $totals['ttl_cbm'] += $item->ttl_cbm; $totals['kg'] += $item->kg; $totals['ttl_kg'] += $item->ttl_kg; $totals['amount'] += $item->ttl_amount; } } if (empty($shipmentOrders)) { continue; } $shipmentsData[] = [ 'shipment_id' => $shipment->shipment_id, 'status' => $shipment->status, 'date' => $shipment->shipment_date, 'total_orders' => 1, 'orders' => $shipmentOrders, 'totals' => $totals, ]; } $invoiceData = null; if ($order->invoice) { $invoice = $order->invoice; $invoiceData = [ 'invoice_no' => $invoice->invoice_number, 'status' => $invoice->status, 'invoice_date' => $invoice->invoice_date, 'due_date' => $invoice->due_date, 'customer' => [ 'name' => $invoice->customer_name, 'mobile' => $invoice->customer_mobile, 'email' => $invoice->customer_email, 'address' => $invoice->customer_address, 'pincode' => $invoice->pincode, ], 'items' => $invoice->items, 'summary' => [ 'amount' => $invoice->final_amount, 'cgst' => 0, 'sgst' => 0, 'total' => $invoice->final_amount_with_gst, ], ]; } return view('admin.see_order', compact( 'order', 'orderData', 'shipmentsData', 'invoiceData' )); } /* --------------------------- * FILTERED LIST + EXPORTS * ---------------------------*/ public function orderShow() { $orders = Order::with([ 'markList', 'shipments', 'invoice' ])->latest('id')->get(); return view('admin.orders', compact('orders')); } private function buildOrdersQueryFromRequest(Request $request) { $query = Order::query() ->with(['markList', 'invoice', 'shipments']); if ($request->filled('search')) { $search = trim($request->search); $query->where(function ($q) use ($search) { $q->where('orders.order_id', 'like', "%{$search}%") ->orWhereHas('markList', function ($q2) use ($search) { $q2->where('company_name', 'like', "%{$search}%") ->orWhere('customer_id', 'like', "%{$search}%") ->orWhere('origin', 'like', "%{$search}%") ->orWhere('destination', 'like', "%{$search}%"); }) ->orWhereHas('invoice', function ($q3) use ($search) { $q3->where('invoice_number', 'like', "%{$search}%"); }) ->orWhereHas('shipments', function ($q4) use ($search) { $q4->where('shipments.shipment_id', 'like', "%{$search}%"); }); }); } if ($request->filled('status')) { $query->where(function ($q) use ($request) { $q->whereHas('invoice', function ($q2) use ($request) { $q2->where('status', $request->status); })->orWhereDoesntHave('invoice'); }); } if ($request->filled('shipment')) { $query->where(function ($q) use ($request) { $q->whereHas('shipments', function ($q2) use ($request) { $q2->where('status', $request->shipment); })->orWhereDoesntHave('shipments'); }); } if ($request->filled('from_date')) { $query->whereDate('orders.created_at', '>=', $request->from_date); } if ($request->filled('to_date')) { $query->whereDate('orders.created_at', '<=', $request->to_date); } return $query->latest('orders.id'); } public function downloadPdf(Request $request) { $orders = $this->buildOrdersQueryFromRequest($request)->get(); $filters = [ 'search' => $request->search, 'status' => $request->status, 'shipment' => $request->shipment, 'from' => $request->from_date, 'to' => $request->to_date, ]; $pdf = PDF::loadView('admin.orders.pdf', compact('orders', 'filters')) ->setPaper('a4', 'landscape'); return $pdf->download( 'orders-report-' . now()->format('Y-m-d') . '.pdf' ); } public function downloadExcel(Request $request) { return Excel::download( new OrdersExport($request), 'orders-report-' . now()->format('Y-m-d') . '.xlsx' ); } /* -------------------------------------------------- * NEW: Create Order + Invoice directly from popup * route: admin.orders.temp.add (Create New Order form) * --------------------------------------------------*/ public function addTempItem(Request $request) { // 1) order-level fields $request->validate([ 'mark_no' => 'required', 'origin' => 'required', 'destination' => 'required', ]); // 2) multi-row items $items = $request->validate([ 'items' => 'required|array', 'items.*.description' => 'required|string', 'items.*.ctn' => 'nullable|numeric', 'items.*.qty' => 'nullable|numeric', 'items.*.ttl_qty' => 'nullable|numeric', 'items.*.unit' => 'nullable|string', 'items.*.price' => 'nullable|numeric', 'items.*.ttl_amount' => 'nullable|numeric', 'items.*.cbm' => 'nullable|numeric', 'items.*.ttl_cbm' => 'nullable|numeric', 'items.*.kg' => 'nullable|numeric', 'items.*.ttl_kg' => 'nullable|numeric', 'items.*.shop_no' => 'nullable|string', ])['items']; // रिकामे rows काढा $items = array_filter($items, function ($row) { return trim($row['description'] ?? '') !== ''; }); if (empty($items)) { return back()->with('error', 'Add at least one item.'); } // 3) totals $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')); // 4) order id generate $orderId = $this->generateOrderId(); // 5) order create $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', ]); // 6) order 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'], ]); } // 7) invoice number $invoiceNumber = $this->generateInvoiceNumber(); // 8) customer fetch $markList = MarkList::where('mark_no', $order->mark_no)->first(); $customer = null; if ($markList && $markList->customer_id) { $customer = User::where('customer_id', $markList->customer_id)->first(); } // 9) invoice create $invoice = Invoice::create([ 'order_id' => $order->id, 'customer_id' => $customer->id ?? null, 'mark_no' => $order->mark_no, 'invoice_number' => $invoiceNumber, 'invoice_date' => now(), 'due_date' => now()->addDays(10), 'payment_method' => null, 'reference_no' => null, 'status' => 'pending', 'final_amount' => $total_amount, 'gst_percent' => 0, 'gst_amount' => 0, 'final_amount_with_gst' => $total_amount, 'customer_name' => $customer->customer_name ?? null, 'company_name' => $customer->company_name ?? null, 'customer_email' => $customer->email ?? null, 'customer_mobile' => $customer->mobile_no ?? null, 'customer_address' => $customer->address ?? null, 'pincode' => $customer->pincode ?? null, 'notes' => null, 'pdf_path' => null, ]); // 10) invoice items foreach ($order->items as $item) { InvoiceItem::create([ 'invoice_id' => $invoice->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, ]); } return redirect()->route('admin.orders.index') ->with('success', 'Order + Invoice created successfully.'); } /* --------------------------- * UPDATE ORDER ITEM (existing orders) * ---------------------------*/ public function updateItem(Request $request, $id) { $item = OrderItem::findOrFail($id); $order = $item->order; $item->update([ 'description' => $request->description, 'ctn' => $request->ctn, 'qty' => $request->qty, 'ttl_qty' => $request->ttl_qty, 'unit' => $request->unit, 'price' => $request->price, 'ttl_amount' => $request->ttl_amount, 'cbm' => $request->cbm, 'ttl_cbm' => $request->ttl_cbm, 'kg' => $request->kg, 'ttl_kg' => $request->ttl_kg, 'shop_no' => $request->shop_no, ]); $this->recalcTotals($order); $this->updateInvoiceFromOrder($order); return back()->with('success', 'Item updated successfully'); } private function updateInvoiceFromOrder(Order $order) { $invoice = Invoice::where('order_id', $order->id)->first(); if (!$invoice) { return; } $invoice->final_amount = $order->ttl_amount; $invoice->gst_percent = 0; $invoice->gst_amount = 0; $invoice->final_amount_with_gst = $order->ttl_amount; $invoice->save(); InvoiceItem::where('invoice_id', $invoice->id)->delete(); foreach ($order->items as $item) { InvoiceItem::create([ 'invoice_id' => $invoice->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, ]); } } }