2026-03-15 17:08:23 +07:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Modules\Business\App\Http\Controllers;
|
|
|
|
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
2026-05-14 11:55:22 +07:00
|
|
|
use App\Models\Purchase;
|
|
|
|
|
use App\Models\PurchaseReturnDetail;
|
|
|
|
|
use App\Models\Sale;
|
|
|
|
|
use App\Models\SaleDetails;
|
|
|
|
|
use App\Models\SaleReturnDetails;
|
|
|
|
|
use App\Models\Vat;
|
|
|
|
|
use App\Models\VatTransaction;
|
2026-03-15 17:08:23 +07:00
|
|
|
use App\Services\PdfService;
|
|
|
|
|
use App\Traits\DateFilterTrait;
|
|
|
|
|
use App\Traits\DateRangeTrait;
|
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
use Maatwebsite\Excel\Facades\Excel;
|
2026-05-14 11:55:22 +07:00
|
|
|
use Modules\Business\App\Exports\ExportTaxReport;
|
2026-03-15 17:08:23 +07:00
|
|
|
|
|
|
|
|
class AcnooVatReportController extends Controller
|
|
|
|
|
{
|
|
|
|
|
use DateFilterTrait, DateRangeTrait;
|
|
|
|
|
|
|
|
|
|
public function __construct()
|
|
|
|
|
{
|
|
|
|
|
$this->middleware('check.permission:vat-reports.read')->only(['index']);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function index(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$businessId = auth()->user()->business_id;
|
2026-05-14 11:55:22 +07:00
|
|
|
|
|
|
|
|
$vats = Vat::where('business_id', $businessId)
|
|
|
|
|
->whereStatus(1)
|
|
|
|
|
->get();
|
2026-03-15 17:08:23 +07:00
|
|
|
|
|
|
|
|
$duration = $request->custom_days ?: 'today';
|
|
|
|
|
[$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date);
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$salesQuery = Sale::where('business_id', $businessId)
|
|
|
|
|
->with([
|
|
|
|
|
'user:id,name',
|
|
|
|
|
'party:id,name,email,phone,type',
|
|
|
|
|
'business:id,companyName',
|
|
|
|
|
'payment_type:id,name',
|
|
|
|
|
'transactions'
|
|
|
|
|
]);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$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 . '%'));
|
|
|
|
|
});
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$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 . '%'));
|
|
|
|
|
});
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$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();
|
|
|
|
|
|
2026-03-15 17:08:23 +07:00
|
|
|
if ($request->ajax()) {
|
|
|
|
|
return response()->json([
|
2026-05-14 11:55:22 +07:00
|
|
|
'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(),
|
2026-03-15 17:08:23 +07:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
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'
|
|
|
|
|
));
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
public function exportExcel()
|
2026-03-15 17:08:23 +07:00
|
|
|
{
|
2026-05-14 11:55:22 +07:00
|
|
|
return Excel::download(new ExportTaxReport, 'tax-report.xlsx');
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
public function exportCsv()
|
2026-03-15 17:08:23 +07:00
|
|
|
{
|
2026-05-14 11:55:22 +07:00
|
|
|
return Excel::download(new ExportTaxReport, 'tax-report.csv');
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
public function exportPdf(Request $request)
|
2026-03-15 17:08:23 +07:00
|
|
|
{
|
|
|
|
|
$businessId = auth()->user()->business_id;
|
2026-05-14 11:55:22 +07:00
|
|
|
$type = $request->type ?? 'sales';
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$duration = $request->custom_days ?: 'today';
|
|
|
|
|
[$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
// SALES QUERY
|
|
|
|
|
$salesQuery = Sale::with('party', 'payment_type', 'transactions')
|
|
|
|
|
->where('business_id', $businessId);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$this->applyDateFilter($salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
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 . '%'));
|
|
|
|
|
});
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$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);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$this->applyDateFilter($purchasesQuery, $duration, 'purchaseDate', $request->from_date, $request->to_date);
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
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 . '%'));
|
|
|
|
|
});
|
|
|
|
|
}
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$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
|
2026-03-15 17:08:23 +07:00
|
|
|
$sales = collect();
|
|
|
|
|
$purchases = collect();
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$limit = $request->per_page ?? 20;
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
if ($type === 'sales') {
|
|
|
|
|
$sales = $salesQuery->latest()->limit($limit)->get();
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
if ($type === 'purchases') {
|
|
|
|
|
$purchases = $purchasesQuery->latest()->limit($limit)->get();
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
$vats = Vat::where('business_id', $businessId)->get();
|
2026-03-15 17:08:23 +07:00
|
|
|
|
2026-05-14 11:55:22 +07:00
|
|
|
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'
|
|
|
|
|
);
|
2026-03-15 17:08:23 +07:00
|
|
|
}
|
|
|
|
|
}
|