middleware('check.permission:vats.read')->only(['index']); $this->middleware('check.permission:vats.create')->only(['create', 'store']); $this->middleware('check.permission:vats.update')->only(['edit', 'update', 'status']); $this->middleware('check.permission:vats.delete')->only(['destroy', 'deleteAll']); } public function index(Request $request) { $business_id = auth()->user()->business_id; $vats = Vat::where('business_id', $business_id) ->orderBy('status', 'desc') ->whereNull('sub_vat') ->where('manage_state', 0) ->latest() ->paginate(20); $vat_groups = Vat::where('business_id', $business_id) ->where(function ($query) { $query->whereNotNull('sub_vat') ->orWhere('manage_state', 1); }) ->with('stateVats.childVat:id,name,rate') ->orderBy('status', 'desc') ->latest() ->paginate(20); return view('business::vats.index', compact('vats', 'vat_groups')); } public function acnooFilter(Request $request) { $vats = Vat::where('business_id', auth()->user()->business_id) ->whereNull('sub_vat') ->when($request->search, function ($query) use ($request) { $query->where(function ($q) use ($request) { $search = $request->search; $q->where('name', 'like', "%$search%"); }); }) ->where('manage_state', 0) ->latest() ->paginate(20); if ($request->ajax()) { return response()->json([ 'data' => view('business::vats.datas', compact('vats'))->render() ]); } return redirect(url()->previous()); } public function VatGroupFilter(Request $request) { $vat_groups = Vat::where('business_id', auth()->user()->business_id) ->when($request->search, function ($query) use ($request) { $query->where(function ($q) use ($request) { $search = $request->search; $q->where('name', 'like', "%$search%"); }); }) ->with('stateVats.childVat:id,name') ->where(function ($query) { $query->whereNotNull('sub_vat') ->orWhere('manage_state', 1); }) ->latest() ->paginate(20); if ($request->ajax()) { return response()->json([ 'data' => view('business::vat-groups.datas', compact('vat_groups'))->render() ]); } return redirect(url()->previous()); } // Vat Group Create public function create() { $vats = Vat::where('business_id', auth()->user()->business_id) ->where('status','1') ->whereNull('sub_vat') ->where('manage_state', 0) ->latest() ->get(); return view('business::vat-groups.create',compact('vats')); } public function store(Request $request) { $request->validate([ 'vat_ids' => 'array', 'rate' => 'nullable|numeric', 'name' => 'required|string|max:255', 'manage_state' => 'nullable|integer|in:0,1', ]); $businessId = auth()->user()->business_id; // SINGLE VAT if ($request->filled('rate') && !$request->vat_ids) { $vat = Vat::create([ 'name' => $request->name, 'rate' => $request->rate, 'business_id' => $businessId, 'manage_state' => 0, ]); } elseif ($request->vat_ids && !$request->manage_state) { // GROUP VAT (OLD SYSTEM) $vats = Vat::whereIn('id', $request->vat_ids) ->where('business_id', $businessId) ->select('id', 'name', 'rate') ->get(); $tax_rate = 0; $sub_vats = []; foreach ($vats as $vatItem) { $sub_vats[] = [ 'id' => $vatItem->id, 'name' => $vatItem->name, 'rate' => $vatItem->rate, ]; $tax_rate += $vatItem->rate; } $vat = Vat::create([ 'rate' => $tax_rate, 'sub_vat' => $sub_vats, 'name' => $request->name, 'business_id' => $businessId, 'manage_state' => 0, ]); } elseif ($request->manage_state == 1) { // STATE WISE VAT (NEW PIVOT SYSTEM) $request->validate([ 'inner_vat_ids' => 'required|array', 'outer_vat_ids' => 'required|array', ]); $innerIds = $request->inner_vat_ids ?? []; $outerIds = $request->outer_vat_ids ?? []; $innerRate = Vat::whereIn('id', $innerIds) ->where('business_id', $businessId) ->sum('rate'); $outerRate = Vat::whereIn('id', $outerIds) ->where('business_id', $businessId) ->sum('rate'); $vat = Vat::create([ 'name' => $request->name, 'rate' => $innerRate ?: $outerRate, 'business_id' => $businessId, 'manage_state' => 1, ]); // Save pivot inner foreach ($innerIds as $id) { VatStateItem::create([ 'parent_vat_id' => $vat->id, 'child_vat_id' => $id, 'type' => 'inner' ]); } // Save pivot outer foreach ($outerIds as $id) { VatStateItem::create([ 'parent_vat_id' => $vat->id, 'child_vat_id' => $id, 'type' => 'outer' ]); } } else { return response()->json([ 'message' => 'Invalid data format.' ], 406); } return response()->json([ 'message' => 'Vat created successfully', 'redirect' => route('business.vats.index'), ]); } // Vat Group Edit public function edit($id) { $vat = Vat::with(['innerStateVats', 'outerStateVats'])->where('business_id', auth()->user()->business_id)->findOrFail($id); $vats = Vat::where('business_id', auth()->user()->business_id) ->where('status','1') ->whereNull('sub_vat') ->where('manage_state', 0) ->latest() ->get(); return view('business::vat-groups.edit', compact('vat', 'vats')); } public function update(Request $request, Vat $vat) { $request->validate([ 'vat_ids' => 'array', 'rate' => 'nullable|numeric', 'name' => 'required|string|max:255', 'manage_state' => 'nullable|integer|in:0,1', ]); DB::beginTransaction(); try { $businessId = auth()->user()->business_id; VatStateItem::where('parent_vat_id', $vat->id)->delete(); // SINGLE VAT if ($request->filled('rate') && !$request->vat_ids && !$request->manage_state) { $vat->update([ 'name' => $request->name, 'rate' => $request->rate, 'status' => $request->status ?? $vat->status, 'manage_state' => 0, ]); // Update group VATs containing this single VAT $vatGroupExist = Vat::where('sub_vat', 'LIKE', '%"id":' . $vat->id . '%')->get(); foreach ($vatGroupExist as $group) { $subVats = collect($group->sub_vat)->map(function ($subVat) use ($vat) { if ($subVat['id'] == $vat->id) { $subVat['rate'] = $vat->rate; $subVat['name'] = $vat->name; } return $subVat; }); $group->update([ 'rate' => $subVats->sum('rate'), 'sub_vat' => $subVats->toArray(), ]); } } // GROUP VAT (OLD SYSTEM) elseif ($request->vat_ids && !$request->manage_state) { $vats = Vat::whereIn('id', $request->vat_ids) ->where('business_id', $businessId) ->select('id', 'name', 'rate') ->get(); $tax_rate = 0; $sub_vats = []; foreach ($vats as $vatItem) { $sub_vats[] = [ 'id' => $vatItem->id, 'name' => $vatItem->name, 'rate' => $vatItem->rate, ]; $tax_rate += $vatItem->rate; } $vat->update([ 'name' => $request->name, 'rate' => $tax_rate, 'sub_vat' => $sub_vats, 'status' => $request->status ?? $vat->status, 'manage_state' => 0, ]); } // STATE-WISE VAT (NEW SYSTEM) elseif ($request->manage_state == 1) { $innerIds = $request->inner_vat_ids ?? []; $outerIds = $request->outer_vat_ids ?? []; $innerRate = Vat::whereIn('id', $innerIds) ->where('business_id', $businessId) ->sum('rate'); $outerRate = Vat::whereIn('id', $outerIds) ->where('business_id', $businessId) ->sum('rate'); $vat->update([ 'name' => $request->name, 'rate' => $innerRate ?: $outerRate, 'status' => $request->status ?? $vat->status, 'manage_state' => 1, 'sub_vat' => null, ]); // Delete old pivot entries VatStateItem::where('parent_vat_id', $vat->id)->delete(); // Insert inner VAT pivot foreach ($innerIds as $id) { VatStateItem::create([ 'parent_vat_id' => $vat->id, 'child_vat_id' => $id, 'type' => 'inner', ]); } // Insert outer VAT pivot foreach ($outerIds as $id) { VatStateItem::create([ 'parent_vat_id' => $vat->id, 'child_vat_id' => $id, 'type' => 'outer', ]); } } else { DB::rollBack(); return response()->json([ 'message' => 'Invalid data format.', ], 406); } DB::commit(); return response()->json([ 'message' => 'Vat updated successfully', 'redirect' => route('business.vats.index'), ]); } catch (\Exception $e) { DB::rollback(); return response()->json([ 'message' => __('Somethings went wrong!'), 'error' => $e->getMessage(), ], 500); } } public function destroy(Vat $vat) { // When sub_vat is null if (is_null($vat->sub_vat)) { // Check if this VAT exists in any other VAT's sub_vat $vatGroupExist = Vat::where('sub_vat', 'LIKE', '%"id":' . $vat->id . '%')->exists(); if ($vatGroupExist) { return response()->json([ 'message' => 'Cannot delete. This VAT is part of a VAT group.', ], 404); } } $vat->delete(); return response()->json([ 'message' => 'VAT Deleted Successfully', 'redirect' => route('business.vats.index'), ]); } public function status(Request $request, $id) { $status = Vat::findOrFail($id); $status->update(['status' => $request->status]); return response()->json(['message' => 'Vat']); } public function deleteAll(Request $request) { $vats = Vat::whereIn('id', $request->ids)->get(); // Filter out VATs that are part of a VAT group when sub_vat is null $restrictedVats = $vats->filter(function ($vat) { return is_null($vat->sub_vat) && Vat::where('sub_vat', 'LIKE', '%"id":' . $vat->id . '%')->exists(); }); // If there are restricted VATs if ($restrictedVats->isNotEmpty()) { return response()->json([ 'message' => 'Some VATs cannot be deleted as they are part of a VAT group.', ], 404); } Vat::whereIn('id', $request->ids)->delete(); return response()->json([ 'message' => __('Selected items deleted successfully.'), 'redirect' => route('business.vats.index'), ]); } }