2026-03-15 17:08:23 +07:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Modules\Business\App\Http\Controllers;
|
|
|
|
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
|
|
|
|
use App\Models\Vat;
|
2026-05-14 11:55:22 +07:00
|
|
|
use App\Models\VatStateItem;
|
2026-03-15 17:08:23 +07:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
|
|
|
|
class AcnooVatController extends Controller
|
|
|
|
|
{
|
|
|
|
|
public function __construct()
|
|
|
|
|
{
|
|
|
|
|
$this->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)
|
|
|
|
|
{
|
2026-05-14 11:55:22 +07:00
|
|
|
$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);
|
|
|
|
|
|
2026-03-15 17:08:23 +07:00
|
|
|
return view('business::vats.index', compact('vats', 'vat_groups'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function acnooFilter(Request $request)
|
|
|
|
|
{
|
2026-05-14 11:55:22 +07:00
|
|
|
$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);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
|
|
|
|
if ($request->ajax()) {
|
|
|
|
|
return response()->json([
|
|
|
|
|
'data' => view('business::vats.datas', compact('vats'))->render()
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
return redirect(url()->previous());
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function VatGroupFilter(Request $request)
|
|
|
|
|
{
|
2026-05-14 11:55:22 +07:00
|
|
|
$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);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
|
|
|
|
if ($request->ajax()) {
|
|
|
|
|
return response()->json([
|
|
|
|
|
'data' => view('business::vat-groups.datas', compact('vat_groups'))->render()
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
return redirect(url()->previous());
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Vat Group Create
|
|
|
|
|
public function create()
|
|
|
|
|
{
|
2026-05-14 11:55:22 +07:00
|
|
|
$vats = Vat::where('business_id', auth()->user()->business_id)
|
|
|
|
|
->where('status','1')
|
|
|
|
|
->whereNull('sub_vat')
|
|
|
|
|
->where('manage_state', 0)
|
|
|
|
|
->latest()
|
|
|
|
|
->get();
|
|
|
|
|
|
2026-03-15 17:08:23 +07:00
|
|
|
return view('business::vat-groups.create',compact('vats'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function store(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$request->validate([
|
2026-05-14 11:55:22 +07:00
|
|
|
'vat_ids' => 'array',
|
|
|
|
|
'rate' => 'nullable|numeric',
|
2026-03-15 17:08:23 +07:00
|
|
|
'name' => 'required|string|max:255',
|
2026-05-14 11:55:22 +07:00
|
|
|
'manage_state' => 'nullable|integer|in:0,1',
|
2026-03-15 17:08:23 +07:00
|
|
|
]);
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$businessId = auth()->user()->business_id;
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
// SINGLE VAT
|
|
|
|
|
if ($request->filled('rate') && !$request->vat_ids) {
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$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();
|
2026-03-15 17:08:23 +07:00
|
|
|
|
|
|
|
|
$tax_rate = 0;
|
|
|
|
|
$sub_vats = [];
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
foreach ($vats as $vatItem) {
|
2026-03-15 17:08:23 +07:00
|
|
|
$sub_vats[] = [
|
2026-05-14 11:55:22 +07:00
|
|
|
'id' => $vatItem->id,
|
|
|
|
|
'name' => $vatItem->name,
|
|
|
|
|
'rate' => $vatItem->rate,
|
2026-03-15 17:08:23 +07:00
|
|
|
];
|
2026-05-14 11:55:22 +07:00
|
|
|
$tax_rate += $vatItem->rate;
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$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',
|
2026-03-15 17:08:23 +07:00
|
|
|
]);
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$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 {
|
2026-03-15 17:08:23 +07:00
|
|
|
return response()->json([
|
2026-05-14 11:55:22 +07:00
|
|
|
'message' => 'Invalid data format.'
|
2026-03-15 17:08:23 +07:00
|
|
|
], 406);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return response()->json([
|
|
|
|
|
'message' => 'Vat created successfully',
|
|
|
|
|
'redirect' => route('business.vats.index'),
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Vat Group Edit
|
|
|
|
|
public function edit($id)
|
|
|
|
|
{
|
2026-05-14 11:55:22 +07:00
|
|
|
$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();
|
|
|
|
|
|
2026-03-15 17:08:23 +07:00
|
|
|
return view('business::vat-groups.edit', compact('vat', 'vats'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function update(Request $request, Vat $vat)
|
|
|
|
|
{
|
|
|
|
|
$request->validate([
|
2026-05-14 11:55:22 +07:00
|
|
|
'vat_ids' => 'array',
|
|
|
|
|
'rate' => 'nullable|numeric',
|
2026-03-15 17:08:23 +07:00
|
|
|
'name' => 'required|string|max:255',
|
2026-05-14 11:55:22 +07:00
|
|
|
'manage_state' => 'nullable|integer|in:0,1',
|
2026-03-15 17:08:23 +07:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
DB::beginTransaction();
|
|
|
|
|
try {
|
2026-05-14 11:55:22 +07:00
|
|
|
$businessId = auth()->user()->business_id;
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
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,
|
|
|
|
|
]);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
// Update group VATs containing this single VAT
|
2026-03-15 17:08:23 +07:00
|
|
|
$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(),
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
// GROUP VAT (OLD SYSTEM)
|
|
|
|
|
elseif ($request->vat_ids && !$request->manage_state) {
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$vats = Vat::whereIn('id', $request->vat_ids)
|
|
|
|
|
->where('business_id', $businessId)
|
|
|
|
|
->select('id', 'name', 'rate')
|
|
|
|
|
->get();
|
2026-03-15 17:08:23 +07:00
|
|
|
|
|
|
|
|
$tax_rate = 0;
|
|
|
|
|
$sub_vats = [];
|
2026-05-14 11:55:22 +07:00
|
|
|
foreach ($vats as $vatItem) {
|
2026-03-15 17:08:23 +07:00
|
|
|
$sub_vats[] = [
|
2026-05-14 11:55:22 +07:00
|
|
|
'id' => $vatItem->id,
|
|
|
|
|
'name' => $vatItem->name,
|
|
|
|
|
'rate' => $vatItem->rate,
|
2026-03-15 17:08:23 +07:00
|
|
|
];
|
2026-05-14 11:55:22 +07:00
|
|
|
$tax_rate += $vatItem->rate;
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$vat->update([
|
2026-05-14 11:55:22 +07:00
|
|
|
'name' => $request->name,
|
2026-03-15 17:08:23 +07:00
|
|
|
'rate' => $tax_rate,
|
|
|
|
|
'sub_vat' => $sub_vats,
|
2026-05-14 11:55:22 +07:00
|
|
|
'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([
|
2026-03-15 17:08:23 +07:00
|
|
|
'name' => $request->name,
|
2026-05-14 11:55:22 +07:00
|
|
|
'rate' => $innerRate ?: $outerRate,
|
2026-03-15 17:08:23 +07:00
|
|
|
'status' => $request->status ?? $vat->status,
|
2026-05-14 11:55:22 +07:00
|
|
|
'manage_state' => 1,
|
|
|
|
|
'sub_vat' => null,
|
2026-03-15 17:08:23 +07:00
|
|
|
]);
|
2026-05-14 11:55:22 +07:00
|
|
|
|
|
|
|
|
// 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 {
|
2026-03-15 17:08:23 +07:00
|
|
|
DB::rollBack();
|
|
|
|
|
return response()->json([
|
|
|
|
|
'message' => 'Invalid data format.',
|
|
|
|
|
], 406);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DB::commit();
|
|
|
|
|
return response()->json([
|
|
|
|
|
'message' => 'Vat updated successfully',
|
|
|
|
|
'redirect' => route('business.vats.index'),
|
|
|
|
|
]);
|
2026-05-14 11:55:22 +07:00
|
|
|
|
2026-03-15 17:08:23 +07:00
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
DB::rollback();
|
2026-05-14 11:55:22 +07:00
|
|
|
return response()->json([
|
|
|
|
|
'message' => __('Somethings went wrong!'),
|
|
|
|
|
'error' => $e->getMessage(),
|
|
|
|
|
], 500);
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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'),
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|