middleware('check.permission:vat-reports.read')->only(['index']); } public function index(Request $request) { $businessId = auth()->user()->business_id; $vats = Vat::where('business_id', $businessId) ->whereStatus(1) ->get(); $duration = $request->custom_days ?: 'today'; [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); $salesQuery = Sale::where('business_id', $businessId) ->with([ 'user:id,name', 'party:id,name,email,phone,type', 'business:id,companyName', 'payment_type:id,name', 'transactions' ]); $this->applyDateFilter( $salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date ); if ($request->filled('search')) { $search = $request->search; $salesQuery->where(function ($query) use ($search) { $query->where('invoiceNumber', 'like', '%' . $search . '%') ->orWhere('totalAmount', 'like', '%' . $search . '%') ->orWhere('discountAmount', 'like', '%' . $search . '%') ->orWhereHas('party', fn($q) => $q->where('name', 'like', '%' . $search . '%')->orWhere('tax_no', 'like', '%' . $search . '%')); }); } $sales = $salesQuery->latest()->paginate($request->per_page ?? 20, ['*'], 'sales')->appends($request->query()); $salesVatTotals = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', SaleDetails::class) ->join('sale_details', 'sale_details.id', '=', 'vat_transactions.vatable_id') ->join('sales', 'sales.id', '=', 'sale_details.sale_id') ->where('sales.business_id', $businessId) ->selectRaw('vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('vat_transactions.vat_id') ->pluck('total','vat_transactions.vat_id') ->toArray(); $salesReturnVatTotals = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', SaleReturnDetails::class) ->join('sale_return_details', 'sale_return_details.id', '=', 'vat_transactions.vatable_id') ->join('sale_details', 'sale_details.id', '=', 'sale_return_details.sale_detail_id') ->join('sales', 'sales.id', '=', 'sale_details.sale_id') ->where('sales.business_id', $businessId) ->selectRaw('vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('vat_transactions.vat_id') ->pluck('total', 'vat_transactions.vat_id') ->toArray(); $saleVatRowMap = VatTransaction::where('business_id', $businessId) ->where('vatable_type', \App\Models\SaleDetails::class) ->whereIn('vatable_id', function ($query) use ($businessId, $duration, $request) { $query->select('sale_details.id') ->from('sale_details') ->join('sales', 'sales.id', '=', 'sale_details.sale_id') ->where('sales.business_id', $businessId); if ($duration === 'custom_days' && $request->from_date && $request->to_date) { $query->whereBetween('sales.saleDate', [$request->from_date, $request->to_date]); } }) ->join('sale_details', 'sale_details.id', '=', 'vat_transactions.vatable_id') ->selectRaw('sale_details.sale_id, vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('sale_details.sale_id', 'vat_transactions.vat_id') ->get() ->groupBy('sale_id') ->map(function ($items) { return $items->pluck('total', 'vat_id')->toArray(); }) ->toArray(); $saleReturnVatRows = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', SaleReturnDetails::class) ->join('sale_return_details','sale_return_details.id','=','vat_transactions.vatable_id') ->join('sale_details','sale_details.id','=','sale_return_details.sale_detail_id') ->join('sales','sales.id','=','sale_details.sale_id') ->selectRaw('sales.id as sale_id, vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as vat_amount') ->groupBy('sales.id','vat_transactions.vat_id') ->get(); $saleReturnVatRowMap = $saleReturnVatRows ->groupBy('sale_id') ->map(fn($rows)=>$rows->pluck('vat_amount','vat_id')) ->toArray(); $purchasesQuery = Purchase::with([ 'details', 'party', 'details.product', 'details.product.category', 'payment_type:id,name', 'transactions' ]) ->where('business_id', $businessId); $this->applyDateFilter( $purchasesQuery, $duration, 'purchaseDate', $request->from_date, $request->to_date ); if ($request->filled('search')) { $search = $request->search; $purchasesQuery->where(function ($query) use ($search) { $query->where('invoiceNumber', 'like', '%' . $search . '%') ->orWhere('totalAmount', 'like', '%' . $search . '%') ->orWhere('discountAmount', 'like', '%' . $search . '%') ->orWhereHas('party', fn($q) => $q->where('name', 'like', '%' . $search . '%')->orWhere('tax_no', 'like', '%' . $search . '%')); }); } $purchases = $purchasesQuery->latest()->paginate($request->per_page ?? 20, ['*'], 'purchases')->appends($request->query()); $purchasesVatTotals = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', \App\Models\PurchaseDetails::class) ->join('purchase_details', 'purchase_details.id', '=', 'vat_transactions.vatable_id') ->join('purchases', 'purchases.id', '=', 'purchase_details.purchase_id') ->where('purchases.business_id', $businessId) ->selectRaw('vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('vat_transactions.vat_id') ->pluck('total','vat_transactions.vat_id') ->toArray(); $purchaseReturnVatTotals = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', PurchaseReturnDetail::class) ->join('purchase_return_details', 'purchase_return_details.id', '=', 'vat_transactions.vatable_id') ->join('purchase_details', 'purchase_details.id', '=', 'purchase_return_details.purchase_detail_id') ->join('purchases', 'purchases.id', '=', 'purchase_details.purchase_id') ->where('purchases.business_id', $businessId) ->selectRaw('vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('vat_transactions.vat_id') ->pluck('total', 'vat_transactions.vat_id') ->toArray(); $purchaseVatRowMap = VatTransaction::where('business_id', $businessId) ->where('vatable_type', \App\Models\PurchaseDetails::class) ->whereIn('vatable_id', function ($query) use ($businessId, $duration, $request) { $query->select('purchase_details.id') ->from('purchase_details') ->join('purchases', 'purchases.id', '=', 'purchase_details.purchase_id') ->where('purchases.business_id', $businessId); if ($duration === 'custom_date' && $request->from_date && $request->to_date) { $query->whereBetween('purchases.purchaseDate', [$request->from_date, $request->to_date]); } }) ->join('purchase_details', 'purchase_details.id', '=', 'vat_transactions.vatable_id') ->selectRaw('purchase_details.purchase_id, vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('purchase_details.purchase_id', 'vat_transactions.vat_id') ->get() ->groupBy('purchase_id') ->map(function ($items) { return $items->pluck('total', 'vat_id')->toArray(); }) ->toArray(); $purchaseReturnVatRows = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', PurchaseReturnDetail::class) ->join('purchase_return_details','purchase_return_details.id','=','vat_transactions.vatable_id') ->join('purchase_details','purchase_details.id','=','purchase_return_details.purchase_detail_id') ->join('purchases','purchases.id','=','purchase_details.purchase_id') ->selectRaw('purchases.id as purchase_id, vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as vat_amount') ->groupBy('purchases.id','vat_transactions.vat_id') ->get(); $purchaseReturnVatRowMap = $purchaseReturnVatRows ->groupBy('purchase_id') ->map(fn($rows) => $rows->pluck('vat_amount','vat_id')) ->toArray(); if ($request->ajax()) { return response()->json([ 'sale_data' => view('business::reports.vats.sale-datas', compact( 'sales', 'salesVatTotals', 'salesReturnVatTotals', 'saleVatRowMap', 'saleReturnVatRowMap', 'vats', 'filter_from_date', 'filter_to_date', 'duration' ))->render(), 'purchase_data' => view('business::reports.vats.purchase-datas', compact( 'purchases', 'purchasesVatTotals', 'purchaseReturnVatTotals', 'purchaseVatRowMap', 'purchaseReturnVatRowMap', 'vats', 'filter_from_date', 'filter_to_date', 'duration' ))->render(), ]); } return view('business::reports.vats.index', compact( 'sales', 'salesVatTotals', 'salesReturnVatTotals', 'saleVatRowMap', 'saleReturnVatRowMap', 'purchases', 'purchasesVatTotals', 'purchaseReturnVatTotals', 'purchaseVatRowMap', 'purchaseReturnVatRowMap', 'vats', 'filter_from_date', 'filter_to_date', 'duration' )); } public function exportExcel() { return Excel::download(new ExportTaxReport, 'tax-report.xlsx'); } public function exportCsv() { return Excel::download(new ExportTaxReport, 'tax-report.csv'); } public function exportPdf(Request $request) { $businessId = auth()->user()->business_id; $type = $request->type ?? 'sales'; $duration = $request->custom_days ?: 'today'; [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); // SALES QUERY $salesQuery = Sale::with('party', 'payment_type', 'transactions') ->where('business_id', $businessId); $this->applyDateFilter($salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date); if ($request->filled('search')) { $search = $request->search; $salesQuery->where(function ($query) use ($search) { $query->where('invoiceNumber', 'like', '%' . $search . '%') ->orWhere('totalAmount', 'like', '%' . $search . '%') ->orWhere('discountAmount', 'like', '%' . $search . '%') ->orWhereHas('party', fn($q) => $q->where('name', 'like', '%' . $search . '%')->orWhere('tax_no', 'like', '%' . $search . '%')); }); } $salesVatTotals = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', SaleDetails::class) ->join('sale_details', 'sale_details.id', '=', 'vat_transactions.vatable_id') ->join('sales', 'sales.id', '=', 'sale_details.sale_id') ->where('sales.business_id', $businessId) ->selectRaw('vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('vat_transactions.vat_id') ->pluck('total','vat_transactions.vat_id') ->toArray(); $salesReturnVatTotals = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', SaleReturnDetails::class) ->join('sale_return_details', 'sale_return_details.id', '=', 'vat_transactions.vatable_id') ->join('sale_details', 'sale_details.id', '=', 'sale_return_details.sale_detail_id') ->join('sales', 'sales.id', '=', 'sale_details.sale_id') ->where('sales.business_id', $businessId) ->selectRaw('vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('vat_transactions.vat_id') ->pluck('total', 'vat_transactions.vat_id') ->toArray(); $saleVatRowMap = VatTransaction::where('business_id', $businessId) ->where('vatable_type', \App\Models\SaleDetails::class) ->whereIn('vatable_id', function ($query) use ($businessId, $duration, $request) { $query->select('sale_details.id') ->from('sale_details') ->join('sales', 'sales.id', '=', 'sale_details.sale_id') ->where('sales.business_id', $businessId); if ($duration === 'custom_days' && $request->from_date && $request->to_date) { $query->whereBetween('sales.saleDate', [$request->from_date, $request->to_date]); } }) ->join('sale_details', 'sale_details.id', '=', 'vat_transactions.vatable_id') ->selectRaw('sale_details.sale_id, vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('sale_details.sale_id', 'vat_transactions.vat_id') ->get() ->groupBy('sale_id') ->map(function ($items) { return $items->pluck('total', 'vat_id')->toArray(); }) ->toArray(); $saleReturnVatRows = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', SaleReturnDetails::class) ->join('sale_return_details','sale_return_details.id','=','vat_transactions.vatable_id') ->join('sale_details','sale_details.id','=','sale_return_details.sale_detail_id') ->join('sales','sales.id','=','sale_details.sale_id') ->selectRaw('sales.id as sale_id, vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as vat_amount') ->groupBy('sales.id','vat_transactions.vat_id') ->get(); $saleReturnVatRowMap = $saleReturnVatRows ->groupBy('sale_id') ->map(fn($rows)=>$rows->pluck('vat_amount','vat_id')) ->toArray(); // PURCHASE QUERY $purchasesQuery = Purchase::with('party', 'payment_type', 'transactions') ->where('business_id', $businessId); $this->applyDateFilter($purchasesQuery, $duration, 'purchaseDate', $request->from_date, $request->to_date); if ($request->filled('search')) { $search = $request->search; $purchasesQuery->where(function ($query) use ($search) { $query->where('invoiceNumber', 'like', '%' . $search . '%') ->orWhere('totalAmount', 'like', '%' . $search . '%') ->orWhere('discountAmount', 'like', '%' . $search . '%') ->orWhereHas('party', fn($q) => $q->where('name', 'like', '%' . $search . '%')->orWhere('tax_no', 'like', '%' . $search . '%')); }); } $purchasesVatTotals = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', \App\Models\PurchaseDetails::class) ->join('purchase_details', 'purchase_details.id', '=', 'vat_transactions.vatable_id') ->join('purchases', 'purchases.id', '=', 'purchase_details.purchase_id') ->where('purchases.business_id', $businessId) ->selectRaw('vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('vat_transactions.vat_id') ->pluck('total','vat_transactions.vat_id') ->toArray(); $purchaseReturnVatTotals = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', PurchaseReturnDetail::class) ->join('purchase_return_details', 'purchase_return_details.id', '=', 'vat_transactions.vatable_id') ->join('purchase_details', 'purchase_details.id', '=', 'purchase_return_details.purchase_detail_id') ->join('purchases', 'purchases.id', '=', 'purchase_details.purchase_id') ->where('purchases.business_id', $businessId) ->selectRaw('vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('vat_transactions.vat_id') ->pluck('total', 'vat_transactions.vat_id') ->toArray(); $purchaseVatRowMap = VatTransaction::where('business_id', $businessId) ->where('vatable_type', \App\Models\PurchaseDetails::class) ->whereIn('vatable_id', function ($query) use ($businessId, $duration, $request) { $query->select('purchase_details.id') ->from('purchase_details') ->join('purchases', 'purchases.id', '=', 'purchase_details.purchase_id') ->where('purchases.business_id', $businessId); if ($duration === 'custom_date' && $request->from_date && $request->to_date) { $query->whereBetween('purchases.purchaseDate', [$request->from_date, $request->to_date]); } }) ->join('purchase_details', 'purchase_details.id', '=', 'vat_transactions.vatable_id') ->selectRaw('purchase_details.purchase_id, vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as total') ->groupBy('purchase_details.purchase_id', 'vat_transactions.vat_id') ->get() ->groupBy('purchase_id') ->map(function ($items) { return $items->pluck('total', 'vat_id')->toArray(); }) ->toArray(); $purchaseReturnVatRows = VatTransaction::where('vat_transactions.business_id', $businessId) ->where('vat_transactions.vatable_type', PurchaseReturnDetail::class) ->join('purchase_return_details','purchase_return_details.id','=','vat_transactions.vatable_id') ->join('purchase_details','purchase_details.id','=','purchase_return_details.purchase_detail_id') ->join('purchases','purchases.id','=','purchase_details.purchase_id') ->selectRaw('purchases.id as purchase_id, vat_transactions.vat_id, SUM(vat_transactions.vat_amount) as vat_amount') ->groupBy('purchases.id','vat_transactions.vat_id') ->get(); $purchaseReturnVatRowMap = $purchaseReturnVatRows ->groupBy('purchase_id') ->map(fn($rows) => $rows->pluck('vat_amount','vat_id')) ->toArray(); // TAB CONTROL $sales = collect(); $purchases = collect(); $limit = $request->per_page ?? 20; if ($type === 'sales') { $sales = $salesQuery->latest()->limit($limit)->get(); } if ($type === 'purchases') { $purchases = $purchasesQuery->latest()->limit($limit)->get(); } $vats = Vat::where('business_id', $businessId)->get(); return PdfService::render('business::reports.vats.pdf', compact( 'sales', 'salesVatTotals', 'salesReturnVatTotals', 'saleVatRowMap', 'saleReturnVatRowMap', 'purchases', 'purchasesVatTotals', 'purchaseReturnVatTotals', 'purchaseVatRowMap', 'purchaseReturnVatRowMap', 'vats', 'type', 'filter_from_date', 'filter_to_date', 'duration' ), 'tax-report.pdf', 'A4', 'L' ); } }