middleware('check.permission:warehouses.read')->only(['index']); $this->middleware('check.permission:warehouses.create')->only(['store']); $this->middleware('check.permission:warehouses.update')->only(['update']); $this->middleware('check.permission:warehouses.delete')->only(['destroy', 'deleteAll']); } public function index(Request $request) { $businessId = auth()->user()->business_id; $branches = Branch::withTrashed()->where('business_id', $businessId)->latest()->get(); $warehouses = Warehouse::with('branch:id,name') ->where('business_id', $businessId) ->withSum(['stocks as total_qty' => function ($query) { $query->when(request()->has('branch_id'), function ($q) { $q->whereColumn('stocks.branch_id', 'warehouses.branch_id'); }); }], 'productStock') ->withSum(['stocks as total_value' => function ($query) { $query->when(request()->has('branch_id'), function ($q) { $q->whereColumn('stocks.branch_id', 'warehouses.branch_id'); }); }], DB::raw('productStock * productPurchasePrice')) ->when($request->branch_id, function ($q) use ($request) { $q->where('branch_id', $request->branch_id); }) ->when(request('search'), function ($q) use ($request) { $q->where(function ($q) use ($request) { $q->where('name', 'like', '%' . $request->search . '%') ->orWhere('email', 'like', '%' . $request->search . '%') ->orWhere('address', 'like', '%' . $request->search . '%') ->orWhere('phone', 'like', '%' . $request->search . '%') ->orWhereHas('branch', function ($q) use ($request) { $q->where('name', 'like', '%' . $request->search . '%'); }); }); }) ->latest() ->paginate($request->per_page ?? 20)->appends($request->query()); if ($request->ajax()) { return response()->json([ 'data' => view('warehouseaddon::warehouse.datas', compact('warehouses', 'branches'))->render() ]); } return view('warehouseaddon::warehouse.index', compact('warehouses', 'branches')); } public function store(Request $request) { $user = auth()->user(); $request->validate([ 'name' => 'required|string|max:255', 'phone' => 'nullable|string|max:20', 'address' => 'nullable|string|max:500', 'email' => [ 'nullable', 'email', 'max:255', Rule::unique('warehouses')->where(fn ($q) => $q->where('business_id', $user->business_id) ), ], ]); $data = $request->except(['business_id', 'branch_id']); $data['business_id'] = $user->business_id; if (moduleCheck('MultiBranchAddon')) { $data['branch_id'] = $request->branch_id ?? $user->branch_id ?? $user->active_branch_id; } Warehouse::create($data); return response()->json([ 'message' => __('Warehouse saved successfully.'), 'redirect' => route('warehouse.warehouses.index'), ]); } public function update(Request $request, $id) { $user = auth()->user(); $warehouse = Warehouse::findOrFail($id); $request->validate([ 'name' => 'required|string|max:255', 'phone' => 'nullable|string|max:20', 'address' => 'nullable|string|max:500', 'email' => [ 'nullable', 'email', 'max:255', Rule::unique('warehouses') ->ignore($warehouse->id) ->where(fn ($q) => $q->where('business_id', $user->business_id)), ], ]); $data = $request->except(['business_id', 'branch_id']); if (moduleCheck('MultiBranchAddon')) { $data['branch_id'] = $request->branch_id ?? $user->branch_id ?? $user->active_branch_id; } $warehouse->update($data); return response()->json([ 'message' => __('Warehouse updated successfully.'), 'redirect' => route('warehouse.warehouses.index'), ]); } public function destroy($id) { $warehouse = Warehouse::findOrFail($id); $warehouse->delete(); return response()->json([ 'message' => __('Warehouse deleted successfully'), 'redirect' => route('warehouse.warehouses.index'), ]); } public function deleteAll(Request $request) { Warehouse::whereIn('id', $request->ids)->delete(); return response()->json([ 'message' => __('Selected items deleted successfully.'), 'redirect' => route('warehouse.warehouses.index'), ]); } public function branchWiseWarehouses(Request $request) { $user = auth()->user(); // Determine the branch $branchId = $user->branch_id ?? $user->active_branch_id; $query = Warehouse::query()->where('business_id', $user->business_id); if ($request->filled('branch_id')) { $query->where('branch_id', $request->branch_id); } elseif ($branchId) { $query->where('branch_id', $branchId); } $warehouses = $query->get(); return response()->json($warehouses); } public function warehouseProduct(Request $request) { $user = auth()->user(); $businessId = $user->business_id; $activeBranchId = $user->branch_id ?? $user->active_branch_id; $search = $request->input('search'); $products = Product::with([ 'stocks', 'unit:id,unitName', 'brand:id,brandName', 'category:id,categoryName', 'warehouse:id,name', 'rack:id,name', 'shelf:id,name' ]) ->where('business_id', $businessId) ->whereHas('stocks', function ($query) use ($activeBranchId) { $query->whereNotNull('warehouse_id') ->when($activeBranchId, fn($q) => $q->where('branch_id', $activeBranchId)); }) ->when($search, function ($q) use ($search) { $q->where(function ($q) use ($search) { $q->where('productName', 'like', '%' . $search . '%') ->orWhere('productCode', 'like', '%' . $search . '%') ->orWhere('productPurchasePrice', 'like', '%' . $search . '%') ->orWhere('productSalePrice', 'like', '%' . $search . '%') ->orWhereHas('category', function ($q) use ($search) { $q->where('categoryName', 'like', '%' . $search . '%'); }) ->orWhereHas('brand', function ($q) use ($search) { $q->where('brandName', 'like', '%' . $search . '%'); }) ->orWhereHas('unit', function ($q) use ($search) { $q->where('unitName', 'like', '%' . $search . '%'); }); }); }) ->latest() ->paginate($request->per_page ?? 20)->appends($request->query()); if ($request->ajax()) { return response()->json([ 'data' => view('warehouseaddon::warehouse.products.datas', compact('products'))->render() ]); } return view('warehouseaddon::warehouse.products.index', compact('products')); } public function getWarehouses() { $business_id = auth()->user()->business_id; $warehouses = Warehouse::where('business_id', $business_id)->select('id', 'name')->latest()->get(); return response()->json([ 'warehouses' => $warehouses, ]); } }