From 4dab96b8d1bc11859d492f5f0a5a0f4895512b79f9db30f6479ef67210c638a4 Mon Sep 17 00:00:00 2001 From: Utkarsh Khedkar Date: Thu, 4 Dec 2025 11:21:46 +0530 Subject: [PATCH] Account and Shipment Changes --- .../Controllers/Admin/ShipmentController.php | 187 +----------- public/invoices/invoice-INV-2025-000030.pdf | Bin 59940 -> 59924 bytes resources/views/admin/account.blade.php | 132 ++++++-- resources/views/admin/shipments.blade.php | 288 +++--------------- routes/web.php | 73 ++--- 5 files changed, 190 insertions(+), 490 deletions(-) diff --git a/app/Http/Controllers/Admin/ShipmentController.php b/app/Http/Controllers/Admin/ShipmentController.php index a0f9428..d281059 100644 --- a/app/Http/Controllers/Admin/ShipmentController.php +++ b/app/Http/Controllers/Admin/ShipmentController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers\Admin; -use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\Shipment; @@ -107,9 +106,6 @@ class ShipmentController extends Controller 'order_qty' => $order->qty, 'order_ttl_qty' => $order->ttl_qty, 'order_ttl_amount' => $order->ttl_amount, - 'order_cbm' => $order->cbm, - 'order_ttl_cbm' => $order->ttl_cbm, - 'order_kg' => $order->kg, 'order_ttl_kg' => $order->ttl_kg, ]); } @@ -117,110 +113,22 @@ class ShipmentController extends Controller return redirect()->back()->with('success', "Shipment $newShipmentId created successfully!"); } - public function edit($id) - { - $shipment = Shipment::with('orders')->findOrFail($id); - - return view('admin.shipments.show', [ - 'shipment' => $shipment, - 'orders' => $shipment->orders, - 'isViewMode' => false // This is the edit mode - ]); - } - + /** + * Show shipment details (for modal popup) + */ public function show($id) { - $mode = request()->get('mode', 'view'); - - $shipment = Shipment::with(['items.order'])->findOrFail($id); - - // Get orders from shipment items - $orders = collect(); - foreach ($shipment->items as $item) { - if ($item->order) { - $orders->push($item->order); - } - } - - // Get orders not assigned to any shipment (available orders) - $usedOrderIds = ShipmentItem::pluck('order_id')->toArray(); - $availableOrders = Order::whereNotIn('id', $usedOrderIds)->get(); - - return view('admin.view-shipment', [ - 'shipment' => $shipment, - 'orders' => $orders, - 'mode' => $mode, - 'availableOrders' => $availableOrders - ]); - } - - public function addOrders(Request $request, $id) - { - $request->validate([ - 'order_ids' => 'required|array|min:1' - ]); - $shipment = Shipment::findOrFail($id); - $orderIds = $request->order_ids; - DB::beginTransaction(); - - try { - $orders = Order::whereIn('id', $orderIds)->get(); - $addedOrders = []; + // Load full order data from orders table + $orders = Order::whereIn('id', + ShipmentItem::where('shipment_id', $id)->pluck('order_id') + )->get(); - foreach ($orders as $order) { - // Prevent duplicates - if (ShipmentItem::where('shipment_id', $shipment->id)->where('order_id', $order->id)->exists()) { - continue; - } - - ShipmentItem::create([ - 'shipment_id' => $shipment->id, - 'order_id' => $order->id, - 'order_ctn' => $order->ctn, - 'order_qty' => $order->qty, - 'order_ttl_qty' => $order->ttl_qty, - 'order_ttl_amount' => $order->ttl_amount, - 'order_cbm' => $order->cbm, - 'order_ttl_cbm' => $order->ttl_cbm, - 'order_kg' => $order->kg, - 'order_ttl_kg' => $order->ttl_kg, - ]); - - $addedOrders[] = $order; - } - - // Recalculate totals - $this->recalculateShipmentTotals($shipment->id); - - DB::commit(); - - $shipment->refresh(); - $shipment->load('items.order'); - - // Get updated orders list - $updatedOrders = collect(); - foreach ($shipment->items as $item) { - if ($item->order) { - $updatedOrders->push($item->order); - } - } - - return response()->json([ - 'success' => true, - 'message' => 'Orders added to shipment successfully.', - 'shipment' => $shipment, - 'orders' => $addedOrders - ]); - - } catch (\Exception $e) { - DB::rollBack(); - return response()->json([ - 'success' => false, - 'message' => 'Failed to add orders: ' . $e->getMessage() - ], 500); - } + return response()->json([ + 'shipment' => $shipment, + 'orders' => $orders + ]); } /** @@ -301,77 +209,4 @@ class ShipmentController extends Controller return redirect()->route('admin.shipments') ->with('success', 'Shipment deleted successfully.'); } - - public function removeOrder(Request $request) - { - $request->validate([ - 'shipment_id' => 'required|exists:shipments,id', - 'order_id' => 'required|exists:orders,id' - ]); - - $shipmentId = $request->shipment_id; - $orderId = $request->order_id; - - // Get order data before deletion - $order = Order::findOrFail($orderId); - - // Delete pivot entry - ShipmentItem::where('shipment_id', $shipmentId) - ->where('order_id', $orderId) - ->delete(); - - // Recalculate totals - $shipment = $this->recalculateShipmentTotals($shipmentId); - - if ($request->ajax() || $request->wantsJson()) { - return response()->json([ - 'success' => true, - 'message' => 'Order removed successfully.', - 'order' => $order, - 'shipment' => $shipment - ]); - } - - return back()->with('success', 'Order removed successfully.'); - } - - private function recalculateShipmentTotals($shipmentId) - { - $shipment = Shipment::with('items')->findOrFail($shipmentId); - - // Use the shipment items to calculate totals - $shipment->total_ctn = $shipment->items->sum('order_ctn'); - $shipment->total_qty = $shipment->items->sum('order_qty'); - $shipment->total_ttl_qty = $shipment->items->sum('order_ttl_qty'); - $shipment->total_amount = $shipment->items->sum('order_ttl_amount'); - $shipment->total_cbm = $shipment->items->sum('order_cbm'); - $shipment->total_ttl_cbm = $shipment->items->sum('order_ttl_cbm'); - $shipment->total_kg = $shipment->items->sum('order_kg'); - $shipment->total_ttl_kg = $shipment->items->sum('order_ttl_kg'); - - $shipment->save(); - $shipment->refresh(); // Refresh to get updated data - - return $shipment; - } - - // Helper method to get available orders for a shipment - public function getAvailableOrders($shipmentId) - { - $shipment = Shipment::findOrFail($shipmentId); - - // Get all used order IDs - $usedOrderIds = ShipmentItem::pluck('order_id')->toArray(); - - // Remove orders that are already in this shipment - $shipmentOrderIds = $shipment->items->pluck('order_id')->toArray(); - $availableOrderIds = array_diff($usedOrderIds, $shipmentOrderIds); - - $availableOrders = Order::whereNotIn('id', $availableOrderIds)->get(); - - return response()->json([ - 'success' => true, - 'availableOrders' => $availableOrders - ]); - } } \ No newline at end of file diff --git a/public/invoices/invoice-INV-2025-000030.pdf b/public/invoices/invoice-INV-2025-000030.pdf index fa4b52732a5bffd62a3c10cf5739bb4f1c4c2a39d7d5e135025ab34207dcbb1f..605f767f3d0266456906f9d94d45c35c265297ab5ecb367f27fe56cc66fef696 100644 GIT binary patch delta 3189 zcmai1X*kqtA6Ar1*%H~Z4j>*&3%_qm=A&vifd?|0w7`+B}SMZKKNUe2l`2LL2eTN~t0 zqq;$$DrOnR;N zY%hO4#lhWdY;nA--B;XR;hpTpNF}Q!>Hh3c!o@=4N{frRouoqMovl9l6PQKE3{B_^ zSe-br;(q&lc4PPc$jcWatRR(*y_jSiT3%zH~>lZ{MzZ zWgO)ameAbZJ3ti@h&OV>xOlXF_%pWlj9+}T+kt&tlKiw;;Iv1 z6t>fsZTC{PF^%5sZ2>!-LrPgYx+T38L$xTaq;=YX>G_z)o5p6OJ`d@YIVXp{T1E5R z+07HJlqR_eIc9ZAzXopY~Hp-5nW zS7bFx)j%)&r0chvnynvGe;xkCxQR*i4ZV7gLTjWmN*dmUsKD7UM25z?6D6Jq@v+di=M@N>lMEY@ zUDYY}pGp?_vxe`;d%sg*McL092NHCsLFtJ?Y&jJ&1E9cUo^snjrc_%dpVn8^kRIE| z&d4PcU%z56($5AT;k9YEbbq1XXp<%Y8WOg;u&zEwXe0Go9KS;$dUOCB4VF)7hwBr2h~$z@7Kv6h_j=dc=R=4 zV&_b!-EAmeZIhAzktWXz8|BH(ECN)6L@;HW09V21clwYOcCRf@QtRYQy+=O!J@a6T zDJD*9Y&uNm&X1fd_t#9(G4xeBsSY8b^42`xqy;HA{tC zy#r(@jX+H@W)6X+<95CqDD3)uTe>-!tZ8&eMCE9pf!Rs2Yd7R~ zfEj#Aq7mSe{aXEe%y6+MJ9jYU8o4W>Oij7${Dzfs%){rLCN>SGT!UNHO!eoONt5ho zm(@7z@$@s)?+D1l&vq960wMCDqE7^;94AU61Z@mgEw78%P8NRUTC)AB)MkH&gSvYt zk3Vd&tq#kr55m8!Qzn|Ml4sd#94)`B0`%Aq^3^7iPmD%Tr<+$V7TY3m$<@F;}FQ7la)zoz^gQWcAO2Dpk9MkNF1|gVavAax!{z8f)u`( z7&nz{wTk&V!If8`$BEC5`?S$QBV2pIo>wba(A>&oe6ypyR~#NmrN_n;3~N~c(H{JT z5H7P~J=z$tHOrLR8bmsIYpy4vy=&=6$eG*SejJeWq+7@3Xx|xME5%d%zxk;Q z6eWD7pBCP;NE+#KawV+WNqCc4WtC>nZ&X7D(JR(!pNfAS?RAenq{R;ua4HrxXGdiB z!6>KhtEtf=l`#RMG-;#J%2`ViP4O{%e3}3KaiINU7R+8;FU=}8NaOCQPWNS&2ON)-QyK=z6rqA2P6FL&V0wU+V()_ zSg?w1!OqGpx>Z`Z8^;Zq!MneQ7*9sEKiSL$76-#F@ z_LbyqJ?@>sOrDqBqwWD4p_%@{Ts;P>DhKD~8$)Y?c9h|yVY6@scYDL7B;_4f_Ik+d zjOFf%?swvD)f(`L>z+@}krn#XBJQ`l?SpC&k3`{3Pb&OS8pq}0w!~hIqqH^z$qTz<#2fWH=#_FW9FONU*s35l?4z&^`6k=)tu18JMKWEQjsUUiMWw!H*N9ajB0HT zQFd0Va%rt}+f}9i!EkuM)6USu(5z8wO*hEtj)$C6AAFF`9}8I7OzLMfZO2mmP)+n} zt4IaY&D^WgOj*a&_uw}5uSnurw-WLWzthgsfVXp}tIsxfUo8E|(dd!qDs{fAg&G?5 z#z79lV=M%`4t`@?DczJd;JyX(lo3qHP(8R&nPjE@ZHuLBB;h9Xi3(;5IAv+oKD$71)>p>P}$y`P7G z;(o@^2-JQa5{iKSjNx#9VZcA0phzV2r-n!j7QU|-hDKobi@?w*Bw{}ggM$4n@{a}# zgMHZ#=@1G}ugF=xh(X-kYVeZbZC@2<&K_hVp xD9Rm)rXXA>7&sh-!BAWf6m1#J|4VTM{q>=sP-zURn>z@FgTb*NFj$YM{~x*>V4?s3 delta 3205 zcmai%c{tSDAIDQ<$vT5jvL#E=Y~L}4$TrBnZ;_p7vTu=Zh^%48R;U^KzLyMd^&hS9zaRu#GX3Tu*3!Z;2Rv5es`u zA7dBtaB_6e!#eDQvpEZ!`}^l;R-dT|*82e7z0LAj;|8@$IaSYS;nmJ%u7{mvzy-)B z)WgoPYZ=8Pw{NNOP{9e~ixQk1qj=RKdt0`K274>L=VD`fGAyIQ8>$8z#4Y8 zxhNzxOf=K@QuGNodWYx?YG2Qsh%l7i$%Tv?xEZ zushvM<`hY-R>091i^Y+XwE{BW_Oz-Z)~<1(@K+hKv4!IXY(-2U<&2*4+H#^91XFb_ z^t9L-ksHcrE?{WR=uyJ%PnR6s_14&2h1)T?S#O@bPchP<$TPG=L{qIZ+b{}yO_3pF z%9<7I@-$TTR~WwB1>Ls{81*xIo68!w5vD|w9rLo)Kv+`8sUUaxhk^QC@j@Np@6hDo zq(tO!JE}GIhTay4x%Mc7P^wK|O2%tD^LVTzC=Jl~oD#W4{T4FLG)1fYrqqOb0_{@3 z+$&1FTHK{YMPniW{bu@3Mf{{f4>gbTg53a3R+jo*enS%B0Z+W>mT0yWl`_d(gH)v^ ztGj$Dpsh8i<2V)exllq zF_?(;!9dQ@SHg5m#vQtjo#!o$Q&=Gr90pvQmsgbA4LkH91n>5w`|g94WO|fBr4ZL= zgKi&}SNvJPyw_%An9f};Q7jWdF4h!_58<}=mC{O@5h|VH#u4#TExP}t2K$dudhGovaZ8;o8EqSY4jG|mC;N) zBEFT}J9@@8{kPuc*IP^Pty$pj%N>VAxWV=N$V(CggS*KGh(ghq-1Me>4B4;RYZ+%| zJO^y=SCU4I9xJ`kYOT5v_nt;L)R-*j0&xtzs6J5+=6Up+r%)1#Ic~aq_#@>E4mtn} zkR7SZ$8H-g$ysE6ctov;Mb`N%kc)ORbnKq@A)^rI%}ksi{?Kknd%d32>W87N`7lV)d)izVGp^IbKNr8^x5OU*QBSqfPof zs-2aQZj#4%sVL5per@|wx|R!dS?i<@Tmw8(Xtut^0-(TW_ZoJ`uA{%Ev&;rXfr9Ej zgZtA#QLi7o+DiDw$Tj#vp-d~lHp@hx;|VP|>l4yM%vnWv?D)<5hP`9ifvQVRsqGs~ zdTpE>>0!S;b8nsv6VIcUore(ZNMZ!0_;htj&luyJ|6R)9FkI#Z`WHpp5lK> z`gBxh`SOrpz{i|jo?uKzesNwn-@xOAtp-EoqD~%?t`sw6Bv!D0jVw zs`9WH%Xzr&hX6wL65hYHwpZS~4%ITxE9}&6yH_bXj$Sj8SjYt}-*rSfTme~fPh7|e z%nVN(NwneZN!^lZZA-_xQ_kdSkNJv;V>7L6)}&~i;+Ab278U&?{dT*&6q=C5=zLTo-*BLFSj)Gdx3~;5(Ib z<=$PI6Cn}gM<;{Lz~a6pPm0Y)=HUJz(;pQQrj;6d9bqi4DpGIqD{2?hPB$%J0j~_mqs2J ziU{S>M~nKL6-?xLq^ z(?n}laUWUcDsK!?{KJnaYW?AA<5hmFgpc0Ze~qG1|4hIW+%|O5H5X*c^XIGSwT#JP z^WE&1XH8s11tnlKOh zJd=5fr}zOF+!elu*-(pK%+gk9G zEvuDH<)^qQS#%?fGVb%xn5x)t{?2aNm!1NR=wzA1_38J+rK_I}32|;gU#>%v^DK70 z5ei^XJvJ`(xUahX&X3=k7xJq~45Udhm^2a&NL_@% zL=L+c!(}Zudu1DM2YyjyECPlA;0PGHwS)yx z$RkrQgf#4^{ZKc7Fo*p}fdB@MIEod(prn7*0N^ME0E7AWl`#K(Vn7;( zfD!$d<*cNU7!*dzUdje3Wov_RMA*S>ZS2qh0`6!hE#-hj$nnemUyCKf&ku%;r?
- - - - Click on quantity to view associated orders. - + + + + + + Click on quantity to view associated orders. +
-
+ +