validate([ 'room_symbol' => 'required|string', 'room_name' => 'required|string', 'lines' => 'required|integer|min:1', 'racks_per_line' => 'required|integer|min:1', 'shelves_per_rack' => 'required|integer|min:1', 'positions_per_shelf' => 'required|integer|min:1', ]); \DB::transaction(function() use($data) { $room = StockRoom::create([ 'room_symbol' => $data['room_symbol'], 'room_name' => $data['room_name'], ]); for ($i = 1; $i <= $data['lines']; $i++) { $line = $room->lines()->create([ 'line_symbol' => $i, 'line_name' => 'Line ' . $i, ]); for ($j = 1; $j <= $data['racks_per_line']; $j++) { $rack = $line->racks()->create([ 'rack_symbol' => $j, 'rack_name' => 'Rack ' . $j, ]); for ($k = 1; $k <= $data['shelves_per_rack']; $k++) { $shelf = $rack->shelves()->create([ 'shelf_symbol' => $k, 'shelf_name' => 'Shelf ' . $k, ]); for ($p = 1; $p <= $data['positions_per_shelf']; $p++) { $shelf->positions()->create([ 'position_symbol' => $p, 'position_name' => 'Position ' . $p, 'capacity' => 0, ]); } } } } }); return response()->json(['message' => 'Room created'], 201); } public function show(StockRoom $room) { $room->load('lines.racks.shelves.positions.sections'); return response()->json($room); } public function update(Request $request, StockRoom $room) { // You can use a single JSON payload with full tree edits, or // issue individual calls per entity (lines, racks, etc.) // For brevity, let’s assume front-end will call your existing modals // to update positions or sections via your other APIs. $room->update($request->only('room_symbol','room_name')); return response()->json(['message'=>'Room updated']); } public function destroy(StockRoom $room) { $room->delete(); return response()->json(['message'=>'Room deleted']); } public function getList() { $rooms = StockRoom::with(['layout', 'lines.racks.shelves.positions.sections'])->get(); return response()->json(['rooms' => $rooms]); } }