diff --git a/Modules/Business/App/Http/Controllers/AcnooCashFlowReportController.php b/Modules/Business/App/Http/Controllers/AcnooCashFlowReportController.php index 5c52df80..3bf928f2 100644 --- a/Modules/Business/App/Http/Controllers/AcnooCashFlowReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooCashFlowReportController.php @@ -31,6 +31,16 @@ public function index(Request $request) ->where('business_id', auth()->user()->business_id) ->whereIn('type', ['debit', 'credit']); + $total_cash_in = (clone $query) + ->where('type', 'credit') + ->sum('amount'); + + $total_cash_out = (clone $query) + ->where('type', 'debit') + ->sum('amount'); + + $total_running_cash = $total_cash_in - $total_cash_out; + // Date Filter $duration = $request->custom_days ?: 'today'; [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); @@ -60,16 +70,6 @@ public function index(Request $request) $perPage = $request->input('per_page', 20); $cash_flows = $query->paginate($perPage)->appends($request->query()); - $cashflow_cash_in = (clone $query) - ->where('type', 'credit') - ->sum('amount'); - - $cashflow_cash_out = (clone $query) - ->where('type', 'debit') - ->sum('amount'); - - $total_running_cash = $cashflow_cash_in - $cashflow_cash_out; - $firstDate = $cash_flows->first()?->date; if ($firstDate) { @@ -83,14 +83,11 @@ public function index(Request $request) if ($request->ajax()) { return response()->json([ - 'data' => view('business::cash-flow.datas', compact('cash_flows', 'cashflow_cash_in', 'cashflow_cash_out', 'opening_balance', 'total_running_cash', 'filter_from_date', 'filter_to_date', 'duration'))->render(), - 'cashflow_cash_in' => currency_format($cashflow_cash_in, 'icon', 2, business_currency()), - 'cashflow_cash_out' => currency_format($cashflow_cash_out, 'icon', 2, business_currency()), - 'total_running_cash' => currency_format($total_running_cash, 'icon', 2, business_currency()), + 'data' => view('business::cash-flow.datas', compact('cash_flows', 'total_cash_in', 'total_cash_out', 'opening_balance', 'total_running_cash', 'filter_from_date', 'filter_to_date', 'duration'))->render() ]); } - return view('business::cash-flow.index', compact('cash_flows', 'cashflow_cash_in', 'cashflow_cash_out', 'opening_balance', 'total_running_cash', 'filter_from_date', 'filter_to_date', 'duration')); + return view('business::cash-flow.index', compact('cash_flows', 'total_cash_in', 'total_cash_out', 'opening_balance', 'total_running_cash', 'filter_from_date', 'filter_to_date', 'duration')); } public function exportExcel() @@ -103,9 +100,9 @@ public function exportCsv() return Excel::download(new ExportCashFlowReport, 'cash-flow.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $query = Transaction::with([ + $cash_flows = Transaction::with([ 'paymentType:id,name', 'sale:id,party_id', 'sale.party:id,name', @@ -117,47 +114,12 @@ public function exportPdf(Request $request) 'dueCollect.party:id,name', ]) ->where('business_id', auth()->user()->business_id) - ->whereIn('type', ['debit', 'credit']); + ->whereIn('type', ['debit', 'credit']) + ->latest() + ->get(); - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); + $opening_balance = 0; - $this->applyDateFilter($query, $duration, 'date', $request->from_date, $request->to_date); - - // Search filter - if ($request->filled('search')) { - $query->where(function ($query) use ($request) { - $query->where('date', 'like', '%' . $request->search . '%') - ->orWhere('invoice_no', 'like', '%' . $request->search . '%') - ->orWhere('platform', 'like', '%' . $request->search . '%') - ->orWhere('amount', 'like', '%' . $request->search . '%') - ->orWhere('transaction_type', 'like', '%' . $request->search . '%') - ->orWhereHas('paymentType', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - } - - // Platform filter - if ($request->filled('platform')) { - $query->where('platform', $request->platform); - } - - // Paginate data - $cash_flows = $query->limit($request->per_page ?? 20)->get(); - - $firstDate = $cash_flows->first()?->date; - - if ($firstDate) { - $opening_balance = (clone $query) - ->whereDate('date', '<', $firstDate) - ->selectRaw("SUM(CASE WHEN type='credit' THEN amount ELSE 0 END) - SUM(CASE WHEN type='debit' THEN amount ELSE 0 END) as balance") - ->value('balance') ?? 0; - } else { - $opening_balance = 0; - } - - return PdfService::render('business::cash-flow.pdf', compact('cash_flows', 'opening_balance', 'duration', 'filter_from_date', 'filter_to_date'),'cash-flow-report.pdf'); + return PdfService::render('business::cash-flow.pdf', compact('cash_flows', 'opening_balance'),'cash-flow-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooComboProductReportController.php b/Modules/Business/App/Http/Controllers/AcnooComboProductReportController.php index 969c120c..a618c2e5 100644 --- a/Modules/Business/App/Http/Controllers/AcnooComboProductReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooComboProductReportController.php @@ -86,54 +86,27 @@ public function exportCsv() return Excel::download(new ExportComboProductReport, 'combo-product-report.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $user = auth()->user(); - - $branchId = null; - if (moduleCheck('MultiBranchAddon')) { - $branchId = $user->branch_id ?? $user->active_branch_id; - } - - $search = $request->input('search'); - - $combo_products = Product::with(['combo_products.stock.product', 'unit:id,unitName', 'category:id,categoryName']) + $combo_products = Product::with(['combo_products', 'unit:id,unitName', 'category:id,categoryName']) ->where('business_id', auth()->user()->business_id) ->where('product_type', 'combo') ->withCount('combo_products as total_combo_products') - ->when($search, function ($q) use ($search) { - $q->where(function ($q) use ($search) { - $q->where('productName', 'like', '%' . $search . '%') - ->orWhere('productCode', 'like', '%' . $search . '%') - ->orWhereHas('category', function ($q) use ($search) { - $q->where('categoryName', 'like', '%' . $search . '%'); - }) - ->orWhereHas('unit', function ($q) use ($search) { - $q->where('unitName', 'like', '%' . $search . '%'); - }); - }); - }) - ->when($branchId, function ($q) use ($branchId) { - $q->whereHas('combo_products.stock', function ($q) use ($branchId) { - $q->where('branch_id', $branchId); - }); - }) - ->latest() - ->limit($request->per_page ?? 20)->get(); + ->get(); - $combo_products->transform(function ($product) { - $product->total_stock = $product->combo_products->sum(function ($combo) { - return optional($combo->stock)->productStock ?? 0; - }); - - $product->total_cost = $product->combo_products->sum(function ($combo) { - return ($combo->quantity ?? 0) * ($combo->purchase_price ?? 0); - }); - - return $product; + $combo_products->transform(function ($product) { + $product->total_stock = $product->combo_products->sum(function ($combo) { + return optional($combo->stock)->productStock ?? 0; }); + $product->total_cost = $product->combo_products->sum(function ($combo) { + return ($combo->quantity ?? 0) * ($combo->purchase_price ?? 0); + }); + + return $product; + }); + return PdfService::render('business::reports.combo-products.pdf', compact('combo_products'),'combo-product-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooDayBookReportController.php b/Modules/Business/App/Http/Controllers/AcnooDayBookReportController.php index c39cd805..b55a1186 100644 --- a/Modules/Business/App/Http/Controllers/AcnooDayBookReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooDayBookReportController.php @@ -60,31 +60,44 @@ public function index(Request $request) $query->where('platform', $request->platform); } + // Calculate summary data + $all_summary_records = (clone $query)->get(); + + $total_amount = $all_summary_records->sum(function ($day_book) { + return match ($day_book->platform) { + 'sale' => $day_book->sale?->totalAmount ?? 0, + 'sale_return' => $day_book->saleReturn?->sale?->totalAmount ?? 0, + 'purchase' => $day_book->purchase?->totalAmount ?? 0, + 'purchase_return' => $day_book->purchaseReturn?->purchase?->totalAmount ?? 0, + 'due_collect', 'due_pay' => $day_book->dueCollect?->totalDue ?? 0, + default => 0 + }; + }); + + $total_money_in = $all_summary_records->where('type', 'credit')->sum(function ($day_book) { + return match ($day_book->platform) { + 'sale' => $day_book->sale?->totalAmount ?? 0, + 'sale_return' => $day_book->saleReturn?->sale?->totalAmount ?? 0, + 'purchase' => $day_book->purchase?->totalAmount ?? 0, + 'purchase_return' => $day_book->purchaseReturn?->purchase?->totalAmount ?? 0, + 'due_collect', 'due_pay' => $day_book->dueCollect?->totalDue ?? 0, + default => 0 + }; + }); + + $total_money_out = $all_summary_records->where('type', 'debit')->sum('amount'); + // Paginate data $perPage = $request->input('per_page', 20); $day_books = $query->latest()->paginate($perPage)->appends($request->query()); - // Calculate summary data - $total_money_in = (clone $query) - ->where('type', 'credit') - ->sum('amount'); - - $total_money_out = (clone $query) - ->where('type', 'debit') - ->sum('amount'); - - $total_money_in_out_amount = $total_money_in + $total_money_out; - if ($request->ajax()) { return response()->json([ - 'data' => view('business::day-book.datas', compact('day_books', 'total_money_in_out_amount', 'total_money_in', 'total_money_out', 'filter_from_date', 'filter_to_date', 'duration'))->render(), - 'total_money_in' => currency_format($total_money_in, 'icon', 2, business_currency()), - 'total_money_out' => currency_format($total_money_out, 'icon', 2, business_currency()), - 'total_money_in_out_amount' => currency_format($total_money_in_out_amount, 'icon', 2, business_currency()), + 'data' => view('business::day-book.datas', compact('day_books', 'total_amount', 'total_money_in', 'total_money_out', 'filter_from_date', 'filter_to_date', 'duration'))->render() ]); } - return view('business::day-book.index', compact('day_books', 'total_money_in_out_amount', 'total_money_in', 'total_money_out', 'filter_from_date', 'filter_to_date', 'duration')); + return view('business::day-book.index', compact('day_books', 'total_amount', 'total_money_in', 'total_money_out', 'filter_from_date', 'filter_to_date', 'duration')); } public function exportExcel() @@ -97,9 +110,9 @@ public function exportCsv() return Excel::download(new ExportDayBookReport, 'day-book.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $query = Transaction::with([ + $day_books = Transaction::with([ 'paymentType:id,name', 'sale:id,user_id,party_id,totalAmount', 'sale.party:id,name', @@ -114,37 +127,10 @@ public function exportPdf(Request $request) 'dueCollect.user:id,name', ]) ->where('business_id', auth()->user()->business_id) - ->whereIn('type', ['debit', 'credit']); + ->whereIn('type', ['debit', 'credit']) + ->latest() + ->get(); - // Apply date filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $this->applyDateFilter($query, $duration, 'date', $request->from_date, $request->to_date); - - // Search filter - if ($request->filled('search')) { - $query->where(function ($query) use ($request) { - $query->where('date', 'like', '%' . $request->search . '%') - ->orWhere('invoice_no', 'like', '%' . $request->search . '%') - ->orWhere('platform', 'like', '%' . $request->search . '%') - ->orWhere('amount', 'like', '%' . $request->search . '%') - ->orWhere('type', 'like', '%' . $request->search . '%') - ->orWhere('transaction_type', 'like', '%' . $request->search . '%') - ->orWhereHas('paymentType', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - } - - // Platform filter - if ($request->filled('platform')) { - $query->where('platform', $request->platform); - } - - // Paginate data - $day_books = $query->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::day-book.pdf', compact('day_books', 'duration', 'filter_from_date', 'filter_to_date'),'day-book-report.pdf'); + return PdfService::render('business::day-book.pdf', compact('day_books'), 'day-book-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooDiscountProductReportController.php b/Modules/Business/App/Http/Controllers/AcnooDiscountProductReportController.php index a485947e..bc1fbbdf 100644 --- a/Modules/Business/App/Http/Controllers/AcnooDiscountProductReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooDiscountProductReportController.php @@ -13,6 +13,7 @@ class AcnooDiscountProductReportController extends Controller { public function index(Request $request) { + $user = auth()->user(); $branchId = null; @@ -20,7 +21,7 @@ public function index(Request $request) $branchId = $user->branch_id ?? $user->active_branch_id; } - $discount_products = SaleDetails::with('product:id,productName,productCode,hsn_code') + $discount_products = SaleDetails::with('product:id,productName,productCode') ->whereHas('product', function ($q) { $q->where('business_id', auth()->user()->business_id); }) @@ -61,35 +62,13 @@ public function exportCsv() return Excel::download(new ExportDiscountProduct, 'discount-products.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $user = auth()->user(); - - $branchId = null; - if (moduleCheck('MultiBranchAddon')) { - $branchId = $user->branch_id ?? $user->active_branch_id; - } - - $discount_products = SaleDetails::with('product:id,productName,productCode,hsn_code') + $discount_products = SaleDetails::with('product:id,productName,productCode') ->whereHas('product', function ($q) { $q->where('business_id', auth()->user()->business_id); }) - ->when(request('search'), function ($q) use ($request) { - $q->whereHas('product', function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%') - ->orWhere('productCode', 'like', '%' . $request->search . '%') - ->orWhere('productPurchasePrice', 'like', '%' . $request->search . '%') - ->orWhere('price', 'like', '%' . $request->search . '%') - ->orWhere('discount', 'like', '%' . $request->search . '%'); - }); - }) - ->when($branchId, function ($q) use ($branchId) { - $q->whereHas('sale', function ($q) use ($branchId) { - $q->where('branch_id', $branchId); - }); - }) ->where('discount', '>', 0) - ->limit($request->per_page ?? 20) ->get(); return PdfService::render('business::reports.discount-products.pdf', compact('discount_products'),'discount-product-report.pdf'); diff --git a/Modules/Business/App/Http/Controllers/AcnooDueReportController.php b/Modules/Business/App/Http/Controllers/AcnooDueReportController.php index 02e66c10..3add4533 100644 --- a/Modules/Business/App/Http/Controllers/AcnooDueReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooDueReportController.php @@ -32,56 +32,79 @@ public function index(Request $request) ->orWhere('credit_limit', 'like', '%' . $request->search . '%'); }); }) - ->when($request->type, function ($q) use ($request) { - $q->where('type', $request->type); + ->when(request('type'), function ($q) use ($request) { + $q->where(function ($q) use ($request) { + $q->where('type', $request->type); + }); }) ->with('sales_dues') ->latest(); - $parties = $query->paginate($request->per_page ?? 20)->appends($request->query()); + if ($activeBranch) { + $query->whereHas('sales_dues', function ($q) use ($activeBranch) { + $q->where('branch_id', $activeBranch->id) + ->where('dueAmount', '>', 0); + }); + } else { + $query->where('due', '>', 0); + } + + $parties = $query->paginate($request->per_page ?? 20); if ($activeBranch) { $parties->setCollection( $parties->getCollection() ->transform(function ($customer) use ($activeBranch) { - $party_due = $customer->sales_dues + $customer->due = $customer->sales_dues ->where('branch_id', $activeBranch->id) ->sum('dueAmount'); - - if ($customer->branch_id === $activeBranch->id) { - $openingBalanceDue = $customer->opening_balance_type === 'due' - ? ($customer->opening_balance ?? 0) - : 0; - - $customer->due = $openingBalanceDue + $party_due; - } else { - - $customer->due = $party_due; - } - return $customer; }) ->filter(fn($customer) => $customer->due > 0) ->values() ); + } + + $total_due = $parties->sum(fn($customer) => $customer->due); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('business::reports.due.datas', compact('parties', 'total_due'))->render() + ]); + } + + if ($activeBranch) { + // Filter customers that have branch-specific due > 0 + $query->whereHas('sales_dues', function ($q) use ($activeBranch) { + $q->where('branch_id', $activeBranch->id) + ->where('dueAmount', '>', 0); + }); } else { + // global due > 0 + $query->where('due', '>', 0); + } + + $parties = $query->paginate(20)->appends($request->query()); + + // Replace customer due with branch-specific due if active branch exists + if ($activeBranch) { $parties->setCollection( $parties->getCollection() - ->filter(fn($customer) => ($customer->due ?? 0) > 0) + ->transform(function ($customer) use ($activeBranch) { + $customer->due = $customer->sales_dues + ->where('branch_id', $activeBranch->id) + ->sum('dueAmount'); + return $customer; + }) + ->filter(fn($customer) => $customer->due > 0) ->values() ); } - $customer_total_due = $parties->getCollection()->sum('due'); + // Calculate total_due + $total_due = $parties->sum(fn($customer) => $customer->due); - if ($request->ajax()) { - return response()->json([ - 'data' => view('business::reports.due.datas', compact('parties'))->render(), - 'customer_total_due' => currency_format($customer_total_due, currency: business_currency()) - ]); - } - - return view('business::reports.due.due-reports', compact('parties', 'customer_total_due')); + return view('business::reports.due.due-reports', compact('parties', 'total_due')); } public function exportExcel() @@ -94,59 +117,37 @@ public function exportCsv() return Excel::download(new ExportDue, 'customer-due.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { $user = auth()->user(); + $businessId = $user->business_id; $activeBranch = $user->active_branch; - $business_id = $user->business_id; - $query = Party::where('business_id', $business_id) + $query = Party::where('business_id', $businessId) ->where('type', '!=', 'Supplier') - ->when($request->search, function ($q) use ($request) { - $q->where(function ($q2) use ($request) { - $q2->where('type', 'like', '%' . $request->search . '%') - ->orWhere('name', 'like', '%' . $request->search . '%') - ->orWhere('phone', 'like', '%' . $request->search . '%') - ->orWhere('credit_limit', 'like', '%' . $request->search . '%'); - }); - }) - ->when($request->type, function ($q) use ($request) { - $q->where('type', $request->type); - }) ->with('sales_dues') ->latest(); + if ($activeBranch) { + $query->whereHas('sales_dues', function ($q) use ($activeBranch) { + $q->where('branch_id', $activeBranch->id) + ->where('dueAmount', '>', 0); + }); + } else { + $query->where('due', '>', 0); + } + $parties = $query->get(); if ($activeBranch) { - $parties = $parties - ->transform(function ($customer) use ($activeBranch) { - $party_due = $customer->sales_dues - ->where('branch_id', $activeBranch->id) - ->sum('dueAmount'); - - if ($customer->branch_id === $activeBranch->id) { - $openingBalanceDue = $customer->opening_balance_type === 'due' - ? ($customer->opening_balance ?? 0) - : 0; - - $customer->due = $openingBalanceDue + $party_due; - } else { - - $customer->due = $party_due; - } - return $customer; - }) - ->filter(fn($customer) => $customer->due > 0) - ->take($request->per_page ?? 20) - ->values(); - } else { - $parties = $parties - ->filter(fn($customer) => ($customer->due ?? 0) > 0) - ->take($request->per_page ?? 20) - ->values(); + $parties->transform(function ($supplier) use ($activeBranch) { + $supplier->due = $supplier->sales_dues + ->where('branch_id', $activeBranch->id) + ->sum('dueAmount'); + return $supplier; + })->filter(fn($supplier) => $supplier->due > 0); } - return PdfService::render('business::reports.due.pdf', compact('parties'), 'customer-due-report.pdf'); + return PdfService::render('business::reports.due.pdf', compact('parties'),'customer-due-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooExpenseReportController.php b/Modules/Business/App/Http/Controllers/AcnooExpenseReportController.php index 98458cd9..7daf6da1 100644 --- a/Modules/Business/App/Http/Controllers/AcnooExpenseReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooExpenseReportController.php @@ -5,6 +5,7 @@ use App\Models\Branch; use App\Models\Expense; use Illuminate\Http\Request; +use Illuminate\Support\Carbon; use App\Http\Controllers\Controller; use App\Services\PdfService; use App\Traits\DateFilterTrait; @@ -25,6 +26,10 @@ public function index(Request $request) { $businessId = auth()->user()->business_id; + $total_expense = Expense::where('business_id', $businessId) + ->whereDate('expenseDate', Carbon::today()->format('Y-m-d')) + ->sum('amount'); + $expenseQuery = Expense::with('category:id,categoryName', 'payment_type:id,name', 'branch:id,name', 'transactions') ->where('business_id', $businessId); @@ -85,40 +90,10 @@ public function exportCsv() public function exportPdf(Request $request) { - $expenseQuery = Expense::with('category:id,categoryName', 'payment_type:id,name', 'branch:id,name', 'transactions') - ->where('business_id', auth()->user()->business_id); + $expense_reports = Expense::with('category:id,categoryName', 'payment_type:id,name', 'branch:id,name', 'transactions')->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); - $expenseQuery->when($request->branch_id, function ($q) use ($request) { - $q->where('branch_id', $request->branch_id); - }); - - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $this->applyDateFilter($expenseQuery, $duration, 'expenseDate', $request->from_date, $request->to_date); - - // Search Filter - if ($request->filled('search')) { - $expenseQuery->where(function ($query) use ($request) { - $query->where('expanseFor', 'like', '%' . $request->search . '%') - ->orWhere('paymentType', 'like', '%' . $request->search . '%') - ->orWhere('referenceNo', 'like', '%' . $request->search . '%') - ->orWhere('amount', 'like', '%' . $request->search . '%') - ->orWhereHas('category', function ($q) use ($request) { - $q->where('categoryName', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('payment_type', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('branch', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - } - - $expense_reports = $expenseQuery->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.expense.pdf', compact('expense_reports', 'duration', 'filter_from_date', 'filter_to_date'),'expenses-report.pdf'); + return PdfService::render('business::reports.expense.pdf', compact('expense_reports'),'expenses-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooExpireProductReportController.php b/Modules/Business/App/Http/Controllers/AcnooExpireProductReportController.php index d631f2af..975884dc 100644 --- a/Modules/Business/App/Http/Controllers/AcnooExpireProductReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooExpireProductReportController.php @@ -80,46 +80,17 @@ public function exportCsv() return Excel::download(new ExportExpiredProductReport, 'expired-product-reports.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $businessId = auth()->user()->business_id; - $expiredProductsQuery = Product::with(['unit:id,unitName', 'brand:id,brandName', 'category:id,categoryName', 'stocks']) + $expired_products = Product::with('unit:id,unitName', 'brand:id,brandName', 'category:id,categoryName', 'stocks') ->withSum('stocks', 'productStock') - ->where('business_id', $businessId) + ->where('business_id', auth()->user()->business_id) ->whereHas('stocks', function ($query) { - $query->whereDate('expire_date', '<=', today())->where('productStock', '>', 0); - }); + $query->whereDate('expire_date', '<', today())->where('productStock', '>', 0); + }) + ->latest() + ->get(); - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $expiredProductsQuery->whereHas('stocks', function ($q) use ($duration, $request) { - $this->applyDateFilter($q, $duration, 'expire_date', $request->from_date, $request->to_date); - }); - - // Search Filter - if ($request->filled('search')) { - $search = $request->search; - $expiredProductsQuery->where(function ($query) use ($search) { - $query->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 . '%'); - }); - }); - } - - $expired_products = $expiredProductsQuery->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.expired-products.pdf', compact('expired_products', 'duration', 'filter_from_date', 'filter_to_date'),'expired-product-report.pdf'); + return PdfService::render('business::reports.expired-products.pdf', compact('expired_products'),'expired-product-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooIncomeReportController.php b/Modules/Business/App/Http/Controllers/AcnooIncomeReportController.php index 7ecc20ba..8a2199c5 100644 --- a/Modules/Business/App/Http/Controllers/AcnooIncomeReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooIncomeReportController.php @@ -83,36 +83,10 @@ public function exportCsv() public function exportPdf(Request $request) { - $incomeQuery = Income::with('category:id,categoryName', 'payment_type:id,name', 'branch:id,name', 'transactions') - ->where('business_id', auth()->user()->business_id); + $income_reports = Income::with('category:id,categoryName', 'payment_type:id,name', 'branch:id,name', 'transactions')->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); - // Branch filter - if ($request->branch_id) { - $incomeQuery->where('branch_id', $request->branch_id); - } - - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $this->applyDateFilter($incomeQuery, $duration, 'incomeDate', $request->from_date, $request->to_date); - - // Search filter - if ($request->filled('search')) { - $search = $request->search; - $incomeQuery->where(function ($query) use ($search) { - $query->where('incomeFor', 'like', '%' . $search . '%') - ->orWhere('paymentType', 'like', '%' . $search . '%') - ->orWhere('amount', 'like', '%' . $search . '%') - ->orWhere('referenceNo', 'like', '%' . $search . '%') - ->orWhereHas('category', fn($q) => $q->where('categoryName', 'like', '%' . $search . '%')) - ->orWhereHas('payment_type', fn($q) => $q->where('name', 'like', '%' . $search . '%')) - ->orWhereHas('branch', fn($q) => $q->where('name', 'like', '%' . $search . '%')); - }); - } - - $income_reports = $incomeQuery->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.income.pdf', compact('income_reports', 'duration', 'filter_from_date', 'filter_to_date'),'incomes-report.pdf'); + return PdfService::render('business::reports.income.pdf', compact('income_reports'),'incomes-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooLossProfitDetailReportController.php b/Modules/Business/App/Http/Controllers/AcnooLossProfitDetailReportController.php index 2e185c43..6fc5f3dc 100644 --- a/Modules/Business/App/Http/Controllers/AcnooLossProfitDetailReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooLossProfitDetailReportController.php @@ -33,14 +33,14 @@ public function lossProfitDetails() $query->where('business_id', $businessId); }) ->whereDate('created_at', '<', $today) - ->sum(DB::raw('"productPurchasePrice" * "productStock"')); + ->sum(DB::raw('productPurchasePrice * productStock')); // Closing stock (up to today) from stocks table $closing_stock_by_purchase = Stock::whereHas('product', function ($query) use ($businessId) { $query->where('business_id', $businessId); }) ->whereDate('created_at', '<=', $today) - ->sum(DB::raw('"productPurchasePrice" * "productStock"')); + ->sum(DB::raw('productPurchasePrice * productStock')); $total_purchase_price = (clone $purchaseQuery)->sum('totalAmount'); $total_purchase_shipping_charge = (clone $purchaseQuery)->sum('shipping_charge'); @@ -59,13 +59,13 @@ public function lossProfitDetails() $query->where('business_id', $businessId); }) ->whereDate('created_at', '<', $today) - ->sum(DB::raw('"productSalePrice" * "productStock"')); + ->sum(DB::raw('productSalePrice * productStock')); $closing_stock_by_sale = Stock::whereHas('product', function ($query) use ($businessId) { $query->where('business_id', $businessId); }) ->whereDate('created_at', '<=', $today) - ->sum(DB::raw('"productSalePrice" * "productStock"')); + ->sum(DB::raw('productSalePrice * productStock')); $total_sale_price = (clone $salesQuery)->sum('totalAmount'); $total_sale_shipping_charge = (clone $salesQuery)->sum('shipping_charge'); @@ -135,14 +135,14 @@ public function lossProfitFilter(Request $request) $q->where('business_id', $businessId); }) ->whereDate('created_at', '<', $startDate) - ->sum(DB::raw('"productPurchasePrice" * "productStock"')); + ->sum(DB::raw('productPurchasePrice * productStock')); // Closing stock by purchase (up to end date) $closing_stock_by_purchase = Stock::whereHas('product', function ($q) use ($businessId) { $q->where('business_id', $businessId); }) ->whereDate('created_at', '<=', $endDate) - ->sum(DB::raw('"productPurchasePrice" * "productStock"')); + ->sum(DB::raw('productPurchasePrice * productStock')); $total_purchase_price = (clone $purchaseQuery)->sum('totalAmount'); $total_purchase_shipping_charge = (clone $purchaseQuery)->sum('shipping_charge'); @@ -159,14 +159,14 @@ public function lossProfitFilter(Request $request) $q->where('business_id', $businessId); }) ->whereDate('created_at', '<', $startDate) - ->sum(DB::raw('"productSalePrice" * "productStock"')); + ->sum(DB::raw('productSalePrice * productStock')); // Closing stock by sale $closing_stock_by_sale = Stock::whereHas('product', function ($q) use ($businessId) { $q->where('business_id', $businessId); }) ->whereDate('created_at', '<=', $endDate) - ->sum(DB::raw('"productSalePrice" * "productStock"')); + ->sum(DB::raw('productSalePrice * productStock')); $total_sale_price = (clone $salesQuery)->sum('totalAmount'); $total_sale_shipping_charge = (clone $salesQuery)->sum('shipping_charge'); diff --git a/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryController.php b/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryController.php index 99cd35b6..dc524e5c 100644 --- a/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryController.php +++ b/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryController.php @@ -7,19 +7,17 @@ use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; use App\Services\PdfService; -use App\Traits\DateRangeTrait; use Maatwebsite\Excel\Facades\Excel; use Modules\Business\App\Exports\ExportLossProfitHistory; class AcnooLossProfitHistoryController extends Controller { - use DateFilterTrait, DateRangeTrait; + use DateFilterTrait; public function index(Request $request) { $user = auth()->user(); $businessId = $user->business_id; - $perPage = request('per_page') ?? 20; $branchId = null; if (moduleCheck('MultiBranchAddon')) { @@ -27,59 +25,42 @@ public function index(Request $request) } $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); $salesQuery = DB::table('sales') ->select( - DB::raw('"saleDate"::date as date'), - DB::raw(" - CASE - WHEN \"lossProfit\" >= 0 THEN 'positive' - ELSE 'negative' - END as profit_type - "), + DB::raw('DATE("saleDate") as date'), DB::raw('SUM(actual_total_amount) as total_sales'), DB::raw('SUM("lossProfit") as total_sale_income') ) ->where('business_id', $businessId) ->when($branchId, fn ($q) => - $q->where('branch_id', $branchId) + $q->where('branch_id', $branchId) ) - ->groupBy( - DB::raw('"saleDate"::date'), - DB::raw(" - CASE - WHEN \"lossProfit\" >= 0 THEN 'positive' - ELSE 'negative' - END - ") - ); + ->groupBy(DB::raw('DATE("saleDate")')); $this->applyDateFilter($salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date); - - $dailySales = $salesQuery->limit($perPage)->get(); + $dailySales = $salesQuery->get(); $sale_datas = $dailySales->map(fn ($sale) => (object)[ 'type' => 'Sale', 'date' => $sale->date, - 'profit_type' => $sale->profit_type, 'total_sales' => $sale->total_sales, 'total_incomes' => $sale->total_sale_income, ]); $incomeQuery = DB::table('incomes') ->select( - DB::raw('"incomeDate"::date as date'), + DB::raw('DATE("incomeDate") as date'), DB::raw('SUM(amount) as total_incomes') ) ->where('business_id', $businessId) ->when($branchId, fn ($q) => $q->where('branch_id', $branchId) ) - ->groupBy(DB::raw('"incomeDate"::date')); + ->groupBy(DB::raw('DATE("incomeDate")')); $this->applyDateFilter($incomeQuery, $duration, 'incomeDate', $request->from_date, $request->to_date); - $dailyIncomes = $incomeQuery->limit($perPage)->get(); + $dailyIncomes = $incomeQuery->get(); $income_datas = $dailyIncomes->map(fn ($income) => (object)[ 'type' => 'Income', @@ -99,10 +80,7 @@ public function index(Request $request) $mergedIncomeSaleData->push($income); } - // multiple sale rows handle - $salesOfDate = $sale_datas->where('date', $date); - - foreach ($salesOfDate as $sale) { + if ($sale = $sale_datas->firstWhere('date', $date)) { $mergedIncomeSaleData->push($sale); } } @@ -112,32 +90,32 @@ public function index(Request $request) if (moduleCheck('HrmAddon')) { $payrollQuery = DB::table('payrolls') ->select( - DB::raw('"date"::date as date'), + DB::raw('DATE("date") as date'), DB::raw('SUM(amount) as total_payrolls') ) ->where('business_id', $businessId) ->when($branchId, fn ($q) => $q->where('branch_id', $branchId) ) - ->groupBy(DB::raw('"date"::date')); + ->groupBy(DB::raw('DATE("date")')); $this->applyDateFilter($payrollQuery, $duration, 'date', $request->from_date, $request->to_date); - $dailyPayrolls = $payrollQuery->limit($perPage)->get(); + $dailyPayrolls = $payrollQuery->get(); } $expenseQuery = DB::table('expenses') ->select( - DB::raw('"expenseDate"::date as date'), + DB::raw('DATE("expenseDate") as date'), DB::raw('SUM(amount) as total_expenses_only') ) ->where('business_id', $businessId) ->when($branchId, fn ($q) => $q->where('branch_id', $branchId) ) - ->groupBy(DB::raw('"expenseDate"::date')); + ->groupBy(DB::raw('DATE("expenseDate")')); $this->applyDateFilter($expenseQuery, $duration, 'expenseDate', $request->from_date, $request->to_date); - $dailyExpenses = $expenseQuery->limit($perPage)->get(); + $dailyExpenses = $expenseQuery->get(); $mergedExpenseData = collect(); $allExpenseDates = $dailyExpenses->pluck('date') @@ -170,6 +148,34 @@ public function index(Request $request) $totalExpenses = $mergedExpenseData->sum('total_expenses'); $netProfit = $grossIncomeProfit - $totalExpenses; + $allTimeSales = DB::table('sales') + ->where('business_id', $businessId) + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->sum('actual_total_amount'); + + $allTimeIncomes = DB::table('incomes') + ->where('business_id', $businessId) + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->sum('amount'); + + $allTimePayrolls = moduleCheck('HrmAddon') + ? DB::table('payrolls') + ->where('business_id', $businessId) + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->sum('amount') + : 0; + + $allTimeExpensesOnly = DB::table('expenses') + ->where('business_id', $businessId) + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->sum('amount'); + + $allTimeSaleProfit = DB::table('sales')->where('business_id', $businessId)->when($branchId, fn ($q) => $q->where('branch_id', $branchId))->sum('lossProfit'); + + $cardGrossProfit = $allTimeIncomes + $allTimeSaleProfit; + $totalCardExpenses = $allTimePayrolls + $allTimeExpensesOnly; + $cardNetProfit = $cardGrossProfit - $totalCardExpenses; + return view('business::loss-profit-histories.index', compact( 'mergedIncomeSaleData', 'mergedExpenseData', @@ -177,9 +183,9 @@ public function index(Request $request) 'grossIncomeProfit', 'totalExpenses', 'netProfit', - 'duration', - 'filter_from_date', - 'filter_to_date' + 'cardGrossProfit', + 'totalCardExpenses', + 'cardNetProfit' )); } @@ -193,158 +199,111 @@ public function exportCsv() return Excel::download(new ExportLossProfitHistory, 'loss-profit-history.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { $user = auth()->user(); $businessId = $user->business_id; - $perPage = request('per_page') ?? 20; $branchId = null; if (moduleCheck('MultiBranchAddon')) { $branchId = $user->branch_id ?? $user->active_branch_id; } - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $salesQuery = DB::table('sales') + // SALES + $dailySales = DB::table('sales') ->select( - DB::raw('"saleDate"::date as date'), - DB::raw(" - CASE - WHEN \"lossProfit\" >= 0 THEN 'positive' - ELSE 'negative' - END as profit_type - "), + DB::raw('DATE("saleDate") as date'), DB::raw('SUM(actual_total_amount) as total_sales'), DB::raw('SUM("lossProfit") as total_sale_income') ) ->where('business_id', $businessId) - ->when($branchId, fn ($q) => - $q->where('branch_id', $branchId) - ) - ->groupBy( - DB::raw('"saleDate"::date'), - DB::raw(" - CASE - WHEN \"lossProfit\" >= 0 THEN 'positive' - ELSE 'negative' - END - ") - ); - - $this->applyDateFilter($salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date); - - $dailySales = $salesQuery->limit($perPage)->get(); + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->groupBy(DB::raw('DATE(saleDate)')) + ->get(); $sale_datas = $dailySales->map(fn ($sale) => (object)[ - 'type' => 'Sale', - 'date' => $sale->date, - 'profit_type' => $sale->profit_type, - 'total_sales' => $sale->total_sales, - 'total_incomes' => $sale->total_sale_income, + 'type' => 'Sale', + 'date' => $sale->date, + 'total_sales' => $sale->total_sales, + 'total_incomes' => $sale->total_sale_income, ]); - $incomeQuery = DB::table('incomes') + // INCOME + $dailyIncomes = DB::table('incomes') ->select( - DB::raw('"incomeDate"::date as date'), + DB::raw('DATE("incomeDate") as date'), DB::raw('SUM(amount) as total_incomes') ) ->where('business_id', $businessId) - ->when($branchId, fn ($q) => - $q->where('branch_id', $branchId) - ) - ->groupBy(DB::raw('"incomeDate"::date')); - - $this->applyDateFilter($incomeQuery, $duration, 'incomeDate', $request->from_date, $request->to_date); - $dailyIncomes = $incomeQuery->limit($perPage)->get(); + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->groupBy(DB::raw('DATE(incomeDate)')) + ->get(); $income_datas = $dailyIncomes->map(fn ($income) => (object)[ - 'type' => 'Income', - 'date' => $income->date, + 'type' => 'Income', + 'date' => $income->date, 'total_incomes' => $income->total_incomes, ]); + // MERGE SALE + INCOME $mergedIncomeSaleData = collect(); - $allDates = $dailySales->pluck('date') - ->merge($dailyIncomes->pluck('date')) - ->unique() - ->sort(); - + $allDates = $dailySales->pluck('date')->merge($dailyIncomes->pluck('date'))->unique()->sort(); foreach ($allDates as $date) { - if ($income = $income_datas->firstWhere('date', $date)) { $mergedIncomeSaleData->push($income); } - - // multiple sale rows handle - $salesOfDate = $sale_datas->where('date', $date); - - foreach ($salesOfDate as $sale) { + if ($sale = $sale_datas->firstWhere('date', $date)) { $mergedIncomeSaleData->push($sale); } } + // PAYROLL $dailyPayrolls = collect(); - if (moduleCheck('HrmAddon')) { - $payrollQuery = DB::table('payrolls') + $dailyPayrolls = DB::table('payrolls') ->select( - DB::raw('"date"::date as date'), + DB::raw('DATE("date") as date'), DB::raw('SUM(amount) as total_payrolls') ) ->where('business_id', $businessId) - ->when($branchId, fn ($q) => - $q->where('branch_id', $branchId) - ) - ->groupBy(DB::raw('"date"::date')); - - $this->applyDateFilter($payrollQuery, $duration, 'date', $request->from_date, $request->to_date); - $dailyPayrolls = $payrollQuery->limit($perPage)->get(); + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->groupBy(DB::raw('DATE(date)')) + ->get(); } - $expenseQuery = DB::table('expenses') + // EXPENSES + $dailyExpenses = DB::table('expenses') ->select( - DB::raw('"expenseDate"::date as date'), + DB::raw('DATE("expenseDate") as date'), DB::raw('SUM(amount) as total_expenses_only') ) ->where('business_id', $businessId) - ->when($branchId, fn ($q) => - $q->where('branch_id', $branchId) - ) - ->groupBy(DB::raw('"expenseDate"::date')); - - $this->applyDateFilter($expenseQuery, $duration, 'expenseDate', $request->from_date, $request->to_date); - $dailyExpenses = $expenseQuery->limit($perPage)->get(); + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->groupBy(DB::raw('DATE(expenseDate)')) + ->get(); $mergedExpenseData = collect(); - $allExpenseDates = $dailyExpenses->pluck('date') - ->merge($dailyPayrolls->pluck('date')) - ->unique() - ->sort(); - + $allExpenseDates = $dailyExpenses->pluck('date')->merge($dailyPayrolls->pluck('date'))->unique()->sort(); foreach ($allExpenseDates as $date) { - if ($expense = $dailyExpenses->firstWhere('date', $date)) { $mergedExpenseData->push((object)[ - 'type' => 'Expense', - 'date' => $date, + 'type' => 'Expense', + 'date' => $date, 'total_expenses' => $expense->total_expenses_only, ]); } - if ($payroll = $dailyPayrolls->firstWhere('date', $date)) { $mergedExpenseData->push((object)[ - 'type' => 'Payroll', - 'date' => $date, + 'type' => 'Payroll', + 'date' => $date, 'total_expenses' => $payroll->total_payrolls, ]); } } + // SUMMARY $grossSaleProfit = $sale_datas->sum('total_sales'); $grossIncomeProfit = $income_datas->sum('total_incomes') + $sale_datas->sum('total_incomes'); - $totalExpenses = $mergedExpenseData->sum('total_expenses'); $netProfit = $grossIncomeProfit - $totalExpenses; @@ -357,10 +316,7 @@ public function exportPdf(Request $request) 'grossSaleProfit', 'grossIncomeProfit', 'totalExpenses', - 'netProfit', - 'duration', - 'filter_to_date', - 'filter_from_date' + 'netProfit' ), 'loss-profit-history.pdf' ); diff --git a/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryReportController.php b/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryReportController.php index 8164ccca..0747bda5 100644 --- a/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryReportController.php @@ -6,11 +6,10 @@ use App\Traits\DateFilterTrait; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; -use App\Traits\DateRangeTrait; class AcnooLossProfitHistoryReportController extends Controller { - use DateFilterTrait, DateRangeTrait; + use DateFilterTrait; public function index(Request $request) { @@ -23,56 +22,39 @@ public function index(Request $request) } $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); $salesQuery = DB::table('sales') ->select( - DB::raw('"saleDate"::date as date'), - DB::raw(" - CASE - WHEN \"lossProfit\" >= 0 THEN 'positive' - ELSE 'negative' - END as profit_type - "), + DB::raw('DATE("saleDate") as date'), DB::raw('SUM(actual_total_amount) as total_sales'), DB::raw('SUM("lossProfit") as total_sale_income') ) ->where('business_id', $businessId) ->when($branchId, fn ($q) => - $q->where('branch_id', $branchId) + $q->where('branch_id', $branchId) ) - ->groupBy( - DB::raw('"saleDate"::date'), - DB::raw(" - CASE - WHEN \"lossProfit\" >= 0 THEN 'positive' - ELSE 'negative' - END - ") - ); + ->groupBy(DB::raw('DATE("saleDate")')); $this->applyDateFilter($salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date); - $dailySales = $salesQuery->get(); $sale_datas = $dailySales->map(fn ($sale) => (object)[ 'type' => 'Sale', 'date' => $sale->date, - 'profit_type' => $sale->profit_type, 'total_sales' => $sale->total_sales, 'total_incomes' => $sale->total_sale_income, ]); $incomeQuery = DB::table('incomes') ->select( - DB::raw('"incomeDate"::date as date'), + DB::raw('DATE("incomeDate") as date'), DB::raw('SUM(amount) as total_incomes') ) ->where('business_id', $businessId) ->when($branchId, fn ($q) => $q->where('branch_id', $branchId) ) - ->groupBy(DB::raw('"incomeDate"::date')); + ->groupBy(DB::raw('DATE("incomeDate")')); $this->applyDateFilter($incomeQuery, $duration, 'incomeDate', $request->from_date, $request->to_date); $dailyIncomes = $incomeQuery->get(); @@ -95,10 +77,7 @@ public function index(Request $request) $mergedIncomeSaleData->push($income); } - // multiple sale rows handle - $salesOfDate = $sale_datas->where('date', $date); - - foreach ($salesOfDate as $sale) { + if ($sale = $sale_datas->firstWhere('date', $date)) { $mergedIncomeSaleData->push($sale); } } @@ -108,14 +87,14 @@ public function index(Request $request) if (moduleCheck('HrmAddon')) { $payrollQuery = DB::table('payrolls') ->select( - DB::raw('"date"::date as date'), + DB::raw('DATE("date") as date'), DB::raw('SUM(amount) as total_payrolls') ) ->where('business_id', $businessId) ->when($branchId, fn ($q) => $q->where('branch_id', $branchId) ) - ->groupBy(DB::raw('"date"::date')); + ->groupBy(DB::raw('DATE("date")')); $this->applyDateFilter($payrollQuery, $duration, 'date', $request->from_date, $request->to_date); $dailyPayrolls = $payrollQuery->get(); @@ -123,14 +102,14 @@ public function index(Request $request) $expenseQuery = DB::table('expenses') ->select( - DB::raw('"expenseDate"::date as date'), + DB::raw('DATE("expenseDate") as date'), DB::raw('SUM(amount) as total_expenses_only') ) ->where('business_id', $businessId) ->when($branchId, fn ($q) => $q->where('branch_id', $branchId) ) - ->groupBy(DB::raw('"expenseDate"::date')); + ->groupBy(DB::raw('DATE("expenseDate")')); $this->applyDateFilter($expenseQuery, $duration, 'expenseDate', $request->from_date, $request->to_date); $dailyExpenses = $expenseQuery->get(); @@ -166,6 +145,34 @@ public function index(Request $request) $totalExpenses = $mergedExpenseData->sum('total_expenses'); $netProfit = $grossIncomeProfit - $totalExpenses; + $allTimeSales = DB::table('sales') + ->where('business_id', $businessId) + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->sum('actual_total_amount'); + + $allTimeIncomes = DB::table('incomes') + ->where('business_id', $businessId) + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->sum('amount'); + + $allTimePayrolls = moduleCheck('HrmAddon') + ? DB::table('payrolls') + ->where('business_id', $businessId) + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->sum('amount') + : 0; + + $allTimeExpensesOnly = DB::table('expenses') + ->where('business_id', $businessId) + ->when($branchId, fn ($q) => $q->where('branch_id', $branchId)) + ->sum('amount'); + + $allTimeSaleProfit = DB::table('sales')->where('business_id', $businessId)->when($branchId, fn ($q) => $q->where('branch_id', $branchId))->sum('lossProfit'); + + $cardGrossProfit = $allTimeIncomes + $allTimeSaleProfit; + $totalCardExpenses = $allTimePayrolls + $allTimeExpensesOnly; + $cardNetProfit = $cardGrossProfit - $totalCardExpenses; + return view('business::loss-profit-histories.index', compact( 'mergedIncomeSaleData', 'mergedExpenseData', @@ -173,9 +180,9 @@ public function index(Request $request) 'grossIncomeProfit', 'totalExpenses', 'netProfit', - 'duration', - 'filter_from_date', - 'filter_to_date' + 'cardGrossProfit', + 'totalCardExpenses', + 'cardNetProfit' )); } diff --git a/Modules/Business/App/Http/Controllers/AcnooPartyLossProfitController.php b/Modules/Business/App/Http/Controllers/AcnooPartyLossProfitController.php index c873fb1c..904b9189 100644 --- a/Modules/Business/App/Http/Controllers/AcnooPartyLossProfitController.php +++ b/Modules/Business/App/Http/Controllers/AcnooPartyLossProfitController.php @@ -5,6 +5,7 @@ use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Models\Party; +use App\Models\Sale; use App\Services\PdfService; use Maatwebsite\Excel\Facades\Excel; use Modules\Business\App\Exports\ExportPartyLossProfit; @@ -13,6 +14,12 @@ class AcnooPartyLossProfitController extends Controller { public function index(Request $request) { + $sale = Sale::where('business_id', auth()->user()->business_id)->whereNotNull('party_id')->get(); + + $totalAmount = $sale->sum('totalAmount'); + $totalProfit = $sale->where('lossProfit', '>', 0)->sum('lossProfit') ?? 0; + $totalLoss = $sale->where('lossProfit', '<', 0)->sum('lossProfit') ?? 0; + $parties = Party::with('sales') ->where('business_id', auth()->user()->business_id) ->where('type', '!=', 'Supplier') @@ -25,20 +32,13 @@ public function index(Request $request) ->paginate($request->per_page ?? 20) ->appends($request->query()); - $totalSaleAmount = $parties->sum(fn($party) => $party->sales?->sum('totalAmount') ?? 0); - $totalProfit = $parties->sum(fn($party) => $party->sales?->where('lossProfit', '>', 0)->sum('lossProfit') ?? 0); - $totalLoss = $parties->sum(fn($party) => $party->sales?->where('lossProfit', '<', 0)->sum('lossProfit') ?? 0); - if ($request->ajax()) { return response()->json([ - 'data' => view('business::party-reports.loss-profit.datas', compact('parties', 'totalSaleAmount', 'totalProfit', 'totalLoss'))->render(), - 'totalSaleAmount' => currency_format($totalSaleAmount, currency: business_currency()), - 'totalProfit' => currency_format($totalProfit, currency: business_currency()), - 'totalLoss' => currency_format($totalLoss, currency: business_currency()), + 'data' => view('business::party-reports.loss-profit.datas', compact('parties'))->render() ]); } - return view('business::party-reports.loss-profit.index', compact('parties', 'totalSaleAmount', 'totalProfit', 'totalLoss')); + return view('business::party-reports.loss-profit.index', compact('parties', 'totalAmount', 'totalProfit', 'totalLoss')); } public function exportExcel() @@ -51,24 +51,18 @@ public function exportCsv() return Excel::download(new ExportPartyLossProfit, 'party-loss-profit.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { $parties = Party::with('sales') ->where('business_id', auth()->user()->business_id) ->where('type', '!=', 'Supplier') - ->when($request->search, function ($query) use ($request) { - $query->where(function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }) ->latest() - ->limit($request->per_page ?? 20) ->get(); return PdfService::render('business::party-reports.loss-profit.pdf', compact('parties'),'party-loss-profit-report.pdf'); } - public function view(string $id) + public function view($id) { $party = Party::with('sales.details', 'sales.details.product') ->where('id', $id) diff --git a/Modules/Business/App/Http/Controllers/AcnooProductLossProfitReportController.php b/Modules/Business/App/Http/Controllers/AcnooProductLossProfitReportController.php index e50a0ac7..cef86071 100644 --- a/Modules/Business/App/Http/Controllers/AcnooProductLossProfitReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooProductLossProfitReportController.php @@ -45,8 +45,8 @@ public function index(Request $request) ->with('product:id,productName,productCode') ->select( 'product_id', - DB::raw('SUM(CASE WHEN lossProfit > 0 THEN lossProfit ELSE 0 END) AS profit'), - DB::raw('SUM(CASE WHEN lossProfit < 0 THEN lossProfit ELSE 0 END) AS loss') + DB::raw('SUM(CASE WHEN "lossProfit" > 0 THEN "lossProfit" ELSE 0 END) AS profit'), + DB::raw('SUM(CASE WHEN "lossProfit" < 0 THEN "lossProfit" ELSE 0 END) AS loss') ) ->groupBy('product_id') ->paginate($request->per_page ?? 20) @@ -93,8 +93,8 @@ public function exportPdf() }) ->select( 'product_id', - DB::raw('SUM(CASE WHEN lossProfit > 0 THEN lossProfit ELSE 0 END) as profit'), - DB::raw('SUM(CASE WHEN lossProfit < 0 THEN lossProfit ELSE 0 END) as loss') + DB::raw('SUM(CASE WHEN "lossProfit" > 0 THEN "lossProfit" ELSE 0 END) as profit'), + DB::raw('SUM(CASE WHEN "lossProfit" < 0 THEN "lossProfit" ELSE 0 END) as loss') ) ->groupBy('product_id') ->get(); diff --git a/Modules/Business/App/Http/Controllers/AcnooProductPurchaseHistoryReportController.php b/Modules/Business/App/Http/Controllers/AcnooProductPurchaseHistoryReportController.php index 10ec585b..20216ca1 100644 --- a/Modules/Business/App/Http/Controllers/AcnooProductPurchaseHistoryReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooProductPurchaseHistoryReportController.php @@ -51,7 +51,7 @@ public function index(Request $request) return view('business::product-purchase-history-report.index', compact('products', 'total_purchase_qty', 'total_sale_qty', 'filter_from_date', 'filter_to_date', 'duration')); } - public function show(Request $request, string $id) + public function show(Request $request, $id) { $businessId = auth()->user()->business_id; $duration = $request->custom_days ?: 'today'; @@ -65,7 +65,7 @@ public function show(Request $request, string $id) ->whereHas('purchase', function ($purchase) use ($duration, $request) { $this->applyDateFilter($purchase, $duration, 'purchaseDate', $request->from_date, $request->to_date); }) - ->with('purchase:id,party_id,invoiceNumber,purchaseDate', 'purchase.party:id,name') + ->with('purchase:id,invoiceNumber,purchaseDate') ->select('id', 'purchase_id', 'product_id', 'quantities', 'productPurchasePrice'); $purchaseDetailsQuery->when(filled($request->search), function ($q) use ($request) { @@ -76,9 +76,6 @@ public function show(Request $request, string $id) ->orWhereHas('purchase', function ($q) use ($search) { $q->where('invoiceNumber', 'like', "%{$search}%") ->orWhere('purchaseDate', 'like', "%{$search}%"); - }) - ->orWhereHas('purchase.party', function ($q) use ($search) { - $q->where('name', 'like', "%{$search}%"); }); }); } @@ -92,7 +89,8 @@ public function show(Request $request, string $id) ]); } - return view('business::product-purchase-history-report.details', + return view( + 'business::product-purchase-history-report.details', compact('product', 'purchaseDetails', 'filter_from_date', 'filter_to_date', 'duration') ); } @@ -110,20 +108,9 @@ public function exportCsv() public function exportPdf(Request $request) { $businessId = auth()->user()->business_id; - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - $productQuery = Product::with(['saleDetails', 'purchaseDetails', 'purchaseDetails.purchase', 'stocks', 'combo_products']) - ->where('business_id', $businessId) - ->whereHas('purchaseDetails.purchase', function ($purchase) use ($duration, $request) { - $this->applyDateFilter($purchase, $duration, 'purchaseDate', $request->from_date, $request->to_date); - }); - - $productQuery->when($request->search, function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%'); - }); - - $products = $productQuery->limit($request->per_page ?? 20)->get(); + $productQuery = Product::with('saleDetails', 'purchaseDetails', 'stocks', 'combo_products')->where('business_id', $businessId); + $products = $productQuery->get(); $total_purchase_qty = $products->sum(function ($product) { return $product->purchaseDetails->sum('quantities'); @@ -133,54 +120,31 @@ public function exportPdf(Request $request) return $product->saleDetails->sum('quantities'); }); - return PdfService::render('business::product-purchase-history-report.pdf', compact('products', 'total_purchase_qty', 'total_sale_qty', 'duration', 'filter_from_date', 'filter_to_date'), 'product-purchase-history.pdf'); + return PdfService::render('business::product-purchase-history-report.pdf', compact('products', 'total_purchase_qty', 'total_sale_qty'), 'product-purchase-history.pdf'); } - public function exportDetailExcel(string $id) + public function exportDetailExcel($id) { return Excel::download(new ExportProductPurchaseHistoryDetailReport($id), 'product-purchase-history-details.xlsx'); } - public function exportDetailCsv(string $id) + public function exportDetailCsv($id) { return Excel::download(new ExportProductPurchaseHistoryDetailReport($id), 'product-purchase-history-details.csv'); } - public function exportDetailPdf(Request $request, string $id) + public function exportDetailPdf(Request $request, $id) { - $businessId = auth()->user()->business_id; - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - $product = Product::select('id', 'business_id', 'productName') - ->where('business_id', $businessId) + ->where('business_id', auth()->user()->business_id) ->findOrFail($id); $purchaseDetailsQuery = $product->purchaseDetails() - ->whereHas('purchase', function ($purchase) use ($duration, $request) { - $this->applyDateFilter($purchase, $duration, 'purchaseDate', $request->from_date, $request->to_date); - }) - ->with('purchase:id,party_id,invoiceNumber,purchaseDate', 'purchase.party:id,name') + ->with('purchase:id,invoiceNumber,purchaseDate') ->select('id', 'purchase_id', 'product_id', 'quantities', 'productPurchasePrice'); - $purchaseDetailsQuery->when(filled($request->search), function ($q) use ($request) { - $search = $request->search; - $q->where(function ($q) use ($search) { - $q->where('productPurchasePrice', 'like', "%{$search}%") - ->orWhere('quantities', 'like', "%{$search}%") - ->orWhereHas('purchase', function ($q) use ($search) { - $q->where('invoiceNumber', 'like', "%{$search}%") - ->orWhere('purchaseDate', 'like', "%{$search}%"); - }) - ->orWhereHas('purchase.party', function ($q) use ($search) { - $q->where('name', 'like', "%{$search}%"); - }); - }); - } - ); + $purchaseDetails = $purchaseDetailsQuery->get(); - $purchaseDetails = $purchaseDetailsQuery->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::product-purchase-history-report.pdf-detail', compact('product', 'purchaseDetails', 'duration', 'filter_from_date', 'filter_to_date'), 'product-purchase-history-details.pdf'); + return PdfService::render('business::product-purchase-history-report.pdf-detail', compact('product', 'purchaseDetails'), 'product-purchase-history-details.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooProductPurchaseReportController.php b/Modules/Business/App/Http/Controllers/AcnooProductPurchaseReportController.php index 927f905b..9bbce330 100644 --- a/Modules/Business/App/Http/Controllers/AcnooProductPurchaseReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooProductPurchaseReportController.php @@ -22,6 +22,19 @@ public function index(Request $request) $q->where('business_id', auth()->user()->business_id); }); + $query->when(request('search'), function ($q) use ($request) { + $q->whereHas('product', function ($q) use ($request) { + $q->where('productName', 'like', '%' . $request->search . '%'); + }) + ->orWhereHas('purchase', function ($q) use ($request) { + $q->where('invoiceNumber', 'like', '%' . $request->search . '%') + ->orWhere('purchaseDate', 'like', '%' . $request->search . '%'); + }) + ->orWhereHas('purchase.party', function ($q) use ($request) { + $q->where('name', 'like', '%' . $request->search . '%'); + }); + }); + // Date Filter $duration = $request->custom_days ?: 'today'; [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); @@ -30,21 +43,6 @@ public function index(Request $request) $this->applyDateFilter($q, $duration, 'purchaseDate', $request->from_date, $request->to_date); }); - $query->when(request('search'), function ($q) use ($request) { - $q->where(function ($q) use ($request) { - $q->whereHas('product', function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('purchase', function ($q) use ($request) { - $q->where('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhere('purchaseDate', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('purchase.party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - }); - $product_purchases = $query->paginate($request->per_page ?? 20)->appends($request->query()); if ($request->ajax()) { @@ -66,38 +64,14 @@ public function exportCsv() return Excel::download(new ExportProductPurchaseReport, 'product-purchase.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $query = PurchaseDetails::with('product:id,productName', 'purchase:id,party_id,invoiceNumber,purchaseDate', 'purchase.party:id,name') + $product_purchases = PurchaseDetails::with('product:id,productName', 'purchase:id,party_id,invoiceNumber,purchaseDate', 'purchase.party:id,name') ->whereHas('purchase', function ($q) { $q->where('business_id', auth()->user()->business_id); - }); + }) + ->get(); - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $query->whereHas('purchase', function ($q) use ($duration, $request) { - $this->applyDateFilter($q, $duration, 'purchaseDate', $request->from_date, $request->to_date); - }); - - $query->when(request('search'), function ($q) use ($request) { - $q->where(function ($q) use ($request) { - $q->whereHas('product', function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('purchase', function ($q) use ($request) { - $q->where('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhere('purchaseDate', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('purchase.party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - }); - - $product_purchases = $query->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.product-purchase.pdf', compact('product_purchases', 'duration', 'filter_from_date', 'filter_to_date'), 'product-purchase-report.pdf'); + return PdfService::render('business::reports.product-purchase.pdf', compact('product_purchases'),'product-purchase-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooProductSaleHistoryReportController.php b/Modules/Business/App/Http/Controllers/AcnooProductSaleHistoryReportController.php index 4e0bbabb..e741f8a2 100644 --- a/Modules/Business/App/Http/Controllers/AcnooProductSaleHistoryReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooProductSaleHistoryReportController.php @@ -57,7 +57,7 @@ public function index(Request $request) return view('business::product-sale-history-report.index', compact('products', 'total_purchase_qty', 'total_sale_qty', 'total_sale_price', 'filter_from_date', 'filter_to_date', 'duration')); } - public function show(Request $request, string $id) + public function show(Request $request, $id) { $businessId = auth()->user()->business_id; $duration = $request->custom_days ?: 'today'; @@ -82,9 +82,6 @@ public function show(Request $request, string $id) ->orWhereHas('sale', function ($q) use ($search) { $q->where('invoiceNumber', 'like', "%{$search}%") ->orWhere('saleDate', 'like', "%{$search}%"); - }) - ->orWhereHas('sale.party', function ($q) use ($search) { - $q->where('name', 'like', "%{$search}%"); }); }); } @@ -114,20 +111,9 @@ public function exportCsv() public function exportPdf(Request $request) { $businessId = auth()->user()->business_id; - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - $productQuery = Product::with(['saleDetails', 'purchaseDetails', 'saleDetails.sale', 'stocks', 'combo_products']) - ->where('business_id', $businessId) - ->whereHas('saleDetails.sale', function ($sale) use ($duration, $request) { - $this->applyDateFilter($sale, $duration, 'saleDate', $request->from_date, $request->to_date); - }); - - $productQuery->when($request->search, function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%'); - }); - - $products = $productQuery->limit($request->per_page ?? 20)->get(); + $productQuery = Product::with('saleDetails', 'purchaseDetails', 'stocks', 'combo_products')->where('business_id', $businessId); + $products = $productQuery->get(); $total_single_sale_price = $products->sum(function ($product) { return $product->saleDetails->sum('price'); @@ -143,54 +129,31 @@ public function exportPdf(Request $request) return $product->saleDetails->sum('quantities'); }); - return PdfService::render('business::product-sale-history-report.pdf', compact('products', 'total_purchase_qty', 'total_sale_qty', 'total_sale_price', 'filter_from_date', 'filter_to_date', 'duration'), 'product-sale-history.pdf'); + return PdfService::render('business::product-sale-history-report.pdf', compact('products', 'total_purchase_qty', 'total_sale_qty', 'total_sale_price'), 'product-sale-history.pdf'); } - public function exportDetailExcel(string $id) + public function exportDetailExcel($id) { return Excel::download(new ExportProductSaleHistoryDetailReport($id), 'product-sale-history-details.xlsx'); } - public function exportDetailCsv(string $id) + public function exportDetailCsv($id) { return Excel::download(new ExportProductSaleHistoryDetailReport($id), 'product-sale-history-details.csv'); } - public function exportDetailPdf(Request $request, string $id) + public function exportDetailPdf(Request $request, $id) { - $businessId = auth()->user()->business_id; - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - $product = Product::select('id', 'business_id', 'productName') - ->where('business_id', $businessId) + ->where('business_id', auth()->user()->business_id) ->findOrFail($id); $saleDetailsQuery = $product->saleDetails() - ->whereHas('sale', function ($sale) use ($duration, $request) { - $this->applyDateFilter($sale, $duration, 'saleDate', $request->from_date, $request->to_date); - }) ->with('sale:id,party_id,invoiceNumber,saleDate', 'sale.party:id,name') ->select('id', 'sale_id', 'product_id', 'quantities', 'lossprofit', 'price', 'productPurchasePrice'); - $saleDetailsQuery->when(filled($request->search), function ($q) use ($request) { - $search = $request->search; - $q->where(function ($q) use ($search) { - $q->where('price', 'like', "%{$search}%") - ->orWhere('quantities', 'like', "%{$search}%") - ->orWhereHas('sale', function ($q) use ($search) { - $q->where('invoiceNumber', 'like', "%{$search}%") - ->orWhere('saleDate', 'like', "%{$search}%"); - }) - ->orWhereHas('sale.party', function ($q) use ($search) { - $q->where('name', 'like', "%{$search}%"); - }); - }); - } - ); + $saleDetails = $saleDetailsQuery->get(); - $saleDetails = $saleDetailsQuery->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::product-sale-history-report.pdf-detail', compact('product', 'saleDetails', 'duration', 'filter_from_date', 'filter_to_date'), 'product-sale-history-details.pdf'); + return PdfService::render('business::product-sale-history-report.pdf-detail', compact('product', 'saleDetails'), 'product-sale-history-details.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooProductSaleReportController.php b/Modules/Business/App/Http/Controllers/AcnooProductSaleReportController.php index a439ce6e..469792ab 100644 --- a/Modules/Business/App/Http/Controllers/AcnooProductSaleReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooProductSaleReportController.php @@ -3,7 +3,7 @@ namespace Modules\Business\App\Http\Controllers; use App\Http\Controllers\Controller; -use App\Models\SaleDetails; +use App\Models\Sale; use App\Services\PdfService; use App\Traits\DateFilterTrait; use App\Traits\DateRangeTrait; @@ -17,34 +17,26 @@ class AcnooProductSaleReportController extends Controller public function index(Request $request) { - $query = SaleDetails::with('product:id,productName', 'sale:id,party_id,invoiceNumber,saleDate', 'sale.party:id,name') - ->whereHas('sale', function ($q) { - $q->where('business_id', auth()->user()->business_id); - }); + $query = Sale::with('details:id,sale_id,product_id,quantities,price', 'details.product:id,productName', 'party:id,name') + ->where('business_id', auth()->user()->business_id); + + $query->when(request('search'), function ($q) use ($request) { + $q->where(function ($q) use ($request) { + $q->where('invoiceNumber', 'like', '%' . $request->search . '%') + ->orWhere('saleDate', 'like', '%' . $request->search . '%'); + }) + ->orWhereHas('details.product', function ($q) use ($request) { + $q->where('productName', 'like', '%' . $request->search . '%'); + }) + ->orWhereHas('party', function ($q) use ($request) { + $q->where('name', 'like', '%' . $request->search . '%'); + }); + }); - // Date Filter $duration = $request->custom_days ?: 'today'; [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - $query->whereHas('sale', function ($q) use ($duration, $request) { - $this->applyDateFilter($q, $duration, 'saleDate', $request->from_date, $request->to_date); - }); - - // Search Filter - $query->when(request('search'), function ($q) use ($request) { - $q->where(function ($q) use ($request) { - $q->whereHas('product', function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('sale', function ($q) use ($request) { - $q->where('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhere('saleDate', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('sale.party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - }); + $this->applyDateFilter($query, $duration, 'saleDate', $request->from_date, $request->to_date); $product_sales = $query->paginate($request->per_page ?? 20)->appends($request->query()); @@ -67,39 +59,13 @@ public function exportCsv() return Excel::download(new ExportProductSaleReport, 'product-sales.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $query = SaleDetails::with('product:id,productName', 'sale:id,party_id,invoiceNumber,saleDate', 'sale.party:id,name') - ->whereHas('sale', function ($q) { - $q->where('business_id', auth()->user()->business_id); - }); + $product_sales = Sale::with('details:id,sale_id,product_id,quantities,price', 'details.product:id,productName', 'party:id,name') + ->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $query->whereHas('sale', function ($q) use ($duration, $request) { - $this->applyDateFilter($q, $duration, 'saleDate', $request->from_date, $request->to_date); - }); - - // Search Filter - $query->when(request('search'), function ($q) use ($request) { - $q->where(function ($q) use ($request) { - $q->whereHas('product', function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('sale', function ($q) use ($request) { - $q->where('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhere('saleDate', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('sale.party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - }); - - $product_sales = $query->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.product-sale.pdf', compact('product_sales', 'duration', 'filter_from_date', 'filter_to_date'), 'product-sale-report.pdf'); + return PdfService::render('business::reports.product-sale.pdf', compact('product_sales'),'product-sale-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooPurchaseReportController.php b/Modules/Business/App/Http/Controllers/AcnooPurchaseReportController.php index b2e30939..1c6a8db6 100644 --- a/Modules/Business/App/Http/Controllers/AcnooPurchaseReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooPurchaseReportController.php @@ -26,6 +26,10 @@ public function index(Request $request) { $businessId = auth()->user()->business_id; + $total_purchase = Purchase::where('business_id', $businessId) + ->whereDate('purchaseDate', Carbon::today()) + ->sum('totalAmount'); + $purchasesQuery = Purchase::with('user:id,name', 'party:id,name,email,phone,type', 'payment_type:id,name', 'branch:id,name', 'transactions') ->where('business_id', $businessId); @@ -85,38 +89,11 @@ public function exportCsv() public function exportPdf(Request $request) { - $purchasesQuery = Purchase::with('user:id,name', 'party:id,name,email,phone,type', 'payment_type:id,name', 'branch:id,name', 'transactions') - ->where('business_id', auth()->user()->business_id); + $purchases = Purchase::with('user:id,name', 'party:id,name,email,phone,type', 'payment_type:id,name', 'branch:id,name', 'transactions') + ->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); - $purchasesQuery->when($request->branch_id, function ($q) use ($request) { - $q->where('branch_id', $request->branch_id); - }); - - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $this->applyDateFilter($purchasesQuery, $duration, 'purchaseDate', $request->from_date, $request->to_date); - - // Search Filter - if ($request->filled('search')) { - $purchasesQuery->where(function ($query) use ($request) { - $query->where('paymentType', 'like', '%' . $request->search . '%') - ->orWhere('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhereHas('party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('payment_type', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('branch', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - } - - $purchases = $purchasesQuery->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.purchase.pdf', compact('purchases', 'duration', 'filter_from_date', 'filter_to_date'), 'purchases-report.pdf'); + return PdfService::render('business::reports.purchase.pdf', compact('purchases'), 'purchases-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooPurchaseReturnReportController.php b/Modules/Business/App/Http/Controllers/AcnooPurchaseReturnReportController.php index 1596811c..75bedc30 100644 --- a/Modules/Business/App/Http/Controllers/AcnooPurchaseReturnReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooPurchaseReturnReportController.php @@ -6,6 +6,7 @@ use App\Models\Purchase; use Illuminate\Http\Request; use App\Http\Controllers\Controller; +use App\Models\PurchaseReturnDetail; use App\Services\PdfService; use App\Traits\DateFilterTrait; use App\Traits\DateRangeTrait; @@ -25,6 +26,12 @@ public function index(Request $request) { $businessId = auth()->user()->business_id; + $total_purchase_return = PurchaseReturnDetail::whereHas('purchaseReturn', function ($query) use ($businessId) { + $query->whereHas('purchase', function ($q) use ($businessId) { + $q->where('business_id', $businessId); + }); + })->sum('return_amount'); + $purchasesQuery = Purchase::with([ 'user:id,name', 'branch:id,name', @@ -47,9 +54,7 @@ public function index(Request $request) $duration = $request->custom_days ?: 'today'; [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - $purchasesQuery->whereHas('purchaseReturns', function ($query) use ($duration, $request) { - $this->applyDateFilter($query, $duration, 'return_date', $request->from_date, $request->to_date); - }); + $this->applyDateFilter($purchasesQuery, $duration, 'purchaseDate', $request->from_date, $request->to_date); // Search Filter if ($request->filled('search')) { @@ -64,19 +69,17 @@ public function index(Request $request) }); } + // Calculate Total Purchase Return Amount in the Selected Date Range + $total_purchase_return = PurchaseReturnDetail::whereHas('purchaseReturn', function ($query) use ($businessId) { + $query->whereHas('purchase', function ($q) use ($businessId) { + $q->where('business_id', $businessId); + }); + })->sum('return_amount'); + // Pagination $perPage = $request->input('per_page', 20); $purchases = $purchasesQuery->latest()->paginate($perPage)->appends($request->query()); - $total_purchase_return = (clone $purchasesQuery) - ->with('purchaseReturns.details') - ->get() - ->sum(function ($sale) { - return $sale->purchaseReturns->sum(function ($return) { - return $return->details->sum('return_amount'); - }); - }); - // Handle AJAX Request if ($request->ajax()) { return response()->json([ @@ -102,7 +105,7 @@ public function exportCsv() public function exportPdf(Request $request) { - $purchasesQuery = Purchase::with([ + $purchases = Purchase::with([ 'user:id,name', 'branch:id,name', 'party:id,name,email,phone,type', @@ -114,35 +117,10 @@ public function exportPdf(Request $request) } ]) ->where('business_id', auth()->user()->business_id) - ->whereHas('purchaseReturns'); + ->whereHas('purchaseReturns') + ->latest() + ->get(); - $purchasesQuery->when($request->branch_id, function ($q) use ($request) { - $q->where('branch_id', $request->branch_id); - }); - - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $purchasesQuery->whereHas('purchaseReturns', function ($query) use ($duration, $request) { - $this->applyDateFilter($query, $duration, 'return_date', $request->from_date, $request->to_date); - }); - - // Search Filter - if ($request->filled('search')) { - $purchasesQuery->where(function ($query) use ($request) { - $query->where('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhereHas('party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('branch', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - } - - $purchases = $purchasesQuery->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.purchase-return.pdf', compact('purchases', 'duration', 'filter_from_date', 'filter_to_date'), 'purchase-return-report.pdf'); + return PdfService::render('business::reports.purchase-return.pdf', compact('purchases'), 'purchase-return-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooSaleReportController.php b/Modules/Business/App/Http/Controllers/AcnooSaleReportController.php index f730f02c..536e0bf1 100644 --- a/Modules/Business/App/Http/Controllers/AcnooSaleReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooSaleReportController.php @@ -5,6 +5,7 @@ use App\Models\Sale; use App\Models\Branch; use Illuminate\Http\Request; +use Illuminate\Support\Carbon; use App\Http\Controllers\Controller; use App\Services\PdfService; use App\Traits\DateFilterTrait; @@ -25,8 +26,11 @@ public function index(Request $request) { $businessId = auth()->user()->business_id; - $salesQuery = Sale::with('user:id,name', 'party:id,name,email,phone,type', 'payment_type:id,name', 'branch:id,name', 'transactions')->where('business_id', $businessId); + $total_sale = Sale::where('business_id', $businessId) + ->whereDate('saleDate', Carbon::today()) + ->sum('totalAmount'); + $salesQuery = Sale::with('user:id,name', 'party:id,name,email,phone,type', 'payment_type:id,name', 'branch:id,name', 'transactions')->where('business_id', $businessId); $salesQuery->when($request->branch_id, function ($q) use ($request) { $q->where('branch_id', $request->branch_id); }); @@ -84,38 +88,10 @@ public function exportCsv() public function exportPdf(Request $request) { - $salesQuery = Sale::with('user:id,name', 'party:id,name,email,phone,type', 'payment_type:id,name', 'branch:id,name', 'transactions') - ->where('business_id', auth()->user()->business_id); + $sales = Sale::with('user:id,name', 'party:id,name,email,phone,type', 'payment_type:id,name', 'branch:id,name', 'transactions')->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); - $salesQuery->when($request->branch_id, function ($q) use ($request) { - $q->where('branch_id', $request->branch_id); - }); - - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $this->applyDateFilter($salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date); - - // Search Filter - if ($request->filled('search')) { - $salesQuery->where(function ($query) use ($request) { - $query->where('paymentType', 'like', '%' . $request->search . '%') - ->orWhere('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhereHas('party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('payment_type', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('branch', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - } - - $sales = $salesQuery->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.sales.pdf', compact('sales', 'duration', 'filter_from_date', 'filter_to_date'),'sales-report.pdf'); + return PdfService::render('business::reports.sales.pdf', compact('sales'),'sales-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooSaleReturnReportController.php b/Modules/Business/App/Http/Controllers/AcnooSaleReturnReportController.php index 3aa618e6..b99f85f2 100644 --- a/Modules/Business/App/Http/Controllers/AcnooSaleReturnReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooSaleReturnReportController.php @@ -5,6 +5,7 @@ use App\Models\Sale; use App\Models\Branch; use Illuminate\Http\Request; +use App\Models\SaleReturnDetails; use App\Http\Controllers\Controller; use App\Services\PdfService; use App\Traits\DateFilterTrait; @@ -23,6 +24,12 @@ public function __construct() public function index(Request $request) { + $total_sale_return = SaleReturnDetails::whereHas('saleReturn', function ($query) { + $query->whereHas('sale', function ($q) { + $q->where('business_id', auth()->user()->business_id); + }); + })->sum('return_amount'); + $businessId = auth()->user()->business_id; $salesQuery = Sale::with([ @@ -37,7 +44,9 @@ public function index(Request $request) ->with('branch:id,name'); } ]) + ->where('business_id', $businessId) + ->when($request->branch_id, function ($q) use ($request) { $q->where('branch_id', $request->branch_id); })->whereHas('saleReturns'); @@ -46,9 +55,7 @@ public function index(Request $request) $duration = $request->custom_days ?: 'today'; [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - $salesQuery->whereHas('saleReturns', function ($query) use ($request, $duration) { - $this->applyDateFilter($query, $duration, 'return_date', $request->from_date, $request->to_date); - }); + $this->applyDateFilter($salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date); // Search Filter if ($request->filled('search')) { @@ -63,18 +70,15 @@ public function index(Request $request) }); } + $total_sale_return = SaleReturnDetails::whereHas('saleReturn', function ($query) use ($businessId) { + $query->whereHas('sale', function ($q) use ($businessId) { + $q->where('business_id', $businessId); + }); + })->sum('return_amount'); + $perPage = $request->input('per_page', 20); $sales = $salesQuery->latest()->paginate($perPage)->appends($request->query()); - $total_sale_return = (clone $salesQuery) - ->with('saleReturns.details') - ->get() - ->sum(function ($sale) { - return $sale->saleReturns->sum(function ($return) { - return $return->details->sum('return_amount'); - }); - }); - if ($request->ajax()) { return response()->json([ 'data' => view('business::reports.sales-return.datas', compact('sales', 'filter_from_date', 'filter_to_date', 'duration'))->render(), @@ -99,7 +103,7 @@ public function exportCsv() public function exportPdf(Request $request) { - $salesQuery = Sale::with([ + $sales = Sale::with([ 'user:id,name', 'party:id,name', 'branch:id,name', @@ -112,33 +116,10 @@ public function exportPdf(Request $request) } ]) ->where('business_id', auth()->user()->business_id) - ->when($request->branch_id, function ($q) use ($request) { - $q->where('branch_id', $request->branch_id); - })->whereHas('saleReturns'); + ->whereHas('saleReturns') + ->latest() + ->get(); - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $salesQuery->whereHas('saleReturns', function ($query) use ($duration, $request) { - $this->applyDateFilter($query, $duration, 'return_date', $request->from_date, $request->to_date); - }); - - // Search Filter - if ($request->filled('search')) { - $salesQuery->where(function ($query) use ($request) { - $query->where('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhereHas('party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('branch', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - } - - $sales = $salesQuery->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.sales-return.pdf', compact('sales', 'duration', 'filter_from_date', 'filter_to_date'), 'sales-return-report.pdf'); + return PdfService::render('business::reports.sales-return.pdf', compact('sales'), 'sales-return-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooStockReportController.php b/Modules/Business/App/Http/Controllers/AcnooStockReportController.php index 20994a48..d035bfd8 100644 --- a/Modules/Business/App/Http/Controllers/AcnooStockReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooStockReportController.php @@ -2,8 +2,10 @@ namespace Modules\Business\App\Http\Controllers; +use App\Models\Stock; use App\Models\Product; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; use App\Services\PdfService; use Maatwebsite\Excel\Facades\Excel; @@ -20,42 +22,31 @@ public function index(Request $request) { $businessId = auth()->user()->business_id; - $productsQuery = Product::with(['stocks' => function ($q) { - $q->select('id', 'product_id', 'productStock', 'productPurchasePrice', 'productSalePrice'); - }]) - ->where('business_id', $businessId) - ->where('product_type', '!=', 'combo'); + $total_stock_value = Stock::whereHas('product', function ($q) use ($businessId) { + $q->where('business_id', $businessId); + })->sum(DB::raw('"productPurchasePrice" * "productStock"')); - if ($request->search) { - $productsQuery->where(function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%') - ->orWhereHas('stocks', function ($stock) use ($request) { - $stock->where('productSalePrice', 'like', '%' . $request->search . '%') - ->orWhere('productPurchasePrice', 'like', '%' . $request->search . '%'); - }); - }); - } + $total_qty = Stock::whereHas('product', function ($q) use ($businessId) { + $q->where('business_id', $businessId); + })->sum('productStock'); - $stock_reports = $productsQuery + $stock_reports = Product::with('stocks') + ->where('business_id', auth()->user()->business_id) + ->where('product_type', '!=', 'combo') + ->when($request->search, function ($query) use ($request) { + $query->where(function ($q) use ($request) { + $q->where('productName', 'like', '%' . $request->search . '%') + ->orwhere('productSalePrice', 'like', '%' . $request->search . '%') + ->orwhere('productPurchasePrice', 'like', '%' . $request->search . '%'); + }); + }) + ->withSum('stocks', 'productStock') ->latest() - ->paginate($request->per_page ?? 20) - ->appends($request->query()); - - $total_qty = $stock_reports->getCollection()->sum(function ($product) { - return $product->stocks->sum('productStock'); - }); - - $total_stock_value = $stock_reports->getCollection()->sum(function ($product) { - return $product->stocks->sum(function ($stock) { - return $stock->productStock * $stock->productPurchasePrice; - }); - }); + ->paginate($request->per_page ?? 20)->appends($request->query()); if ($request->ajax()) { return response()->json([ - 'data' => view('business::reports.stocks.datas', compact('stock_reports'))->render(), - 'total_stock_value' => currency_format($total_stock_value, currency: business_currency()), - 'total_qty' => $total_qty + 'data' => view('business::reports.stocks.datas', compact('stock_reports'))->render() ]); } @@ -72,29 +63,21 @@ public function exportCsv() return Excel::download(new ExportCurrentStockReport, 'current-stock-report.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $productsQuery = Product::with(['stocks' => function ($q) { - $q->select('id', 'product_id', 'productStock', 'productPurchasePrice', 'productSalePrice'); - }]) + $query = Product::with('stocks') ->where('business_id', auth()->user()->business_id) ->where('product_type', '!=', 'combo'); - if ($request->search) { - $productsQuery->where(function ($q) use ($request) { - $q->where('productName', 'like', '%' . $request->search . '%') - ->orWhereHas('stocks', function ($stock) use ($request) { - $stock->where('productSalePrice', 'like', '%' . $request->search . '%') - ->orWhere('productPurchasePrice', 'like', '%' . $request->search . '%'); - }); + if (request('alert_qty')) { + $stock_reports = $query->get()->filter(function ($product) { + $totalStock = $product->stocks->sum('productStock'); + return $totalStock <= $product->alert_qty; }); + } else { + $stock_reports = $query->latest()->get(); } - $stock_reports = $productsQuery - ->latest() - ->limit($request->per_page ?? 20) - ->get(); - return PdfService::render('business::reports.stocks.pdf', compact('stock_reports'), 'stock-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooSubscriptionReportController.php b/Modules/Business/App/Http/Controllers/AcnooSubscriptionReportController.php index a520a83c..be840d4d 100644 --- a/Modules/Business/App/Http/Controllers/AcnooSubscriptionReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooSubscriptionReportController.php @@ -72,42 +72,16 @@ public function exportCsv() return Excel::download(new ExportSubscription, 'subscribers.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $subscriberQuery = PlanSubscribe::with(['plan:id,subscriptionName','business:id,companyName,business_category_id,pictureUrl','business.category:id,name','gateway:id,name'])->where('business_id', auth()->user()->business_id); + $subscribers = PlanSubscribe::with(['plan:id,subscriptionName','business:id,companyName,business_category_id,pictureUrl','business.category:id,name','gateway:id,name'])->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $this->applyDateFilter($subscriberQuery, $duration, 'created_at', $request->from_date, $request->to_date); - - // Search Filter - if ($request->filled('search')) { - $search = $request->search; - $subscriberQuery->where(function ($query) use ($search) { - $query->where('duration', 'like', '%' . $search . '%') - ->orWhereHas('plan', function ($q) use ($search) { - $q->where('subscriptionName', 'like', '%' . $search . '%'); - }) - ->orWhereHas('gateway', function ($q) use ($search) { - $q->where('name', 'like', '%' . $search . '%'); - }) - ->orWhereHas('business', function ($q) use ($search) { - $q->where('companyName', 'like', '%' . $search . '%') - ->orWhereHas('category', function ($q) use ($search) { - $q->where('name', 'like', '%' . $search . '%'); - }); - }); - }); - } - - $subscribers = $subscriberQuery->latest()->limit($request->per_page ?? 20)->get(); - - return PdfService::render('business::reports.subscription-reports.pdf', compact('subscribers', 'duration', 'filter_from_date', 'filter_to_date'),'subscription-reports.pdf'); + return PdfService::render('business::reports.subscription-reports.pdf', compact('subscribers'),'subscription-reports.pdf'); } - public function getInvoice(string $invoice_id) + public function getInvoice($invoice_id) { $subscriber = PlanSubscribe::with(['plan:id,subscriptionName','business:id,companyName,business_category_id,pictureUrl,phoneNumber,email,address,meta','business.category:id,name','gateway:id,name'])->where('business_id', auth()->user()->business_id)->findOrFail($invoice_id); return view('business::reports.subscription-reports.invoice', compact('subscriber')); diff --git a/Modules/Business/App/Http/Controllers/AcnooSupplierDueReportController.php b/Modules/Business/App/Http/Controllers/AcnooSupplierDueReportController.php index e57e5c2b..2391cb78 100644 --- a/Modules/Business/App/Http/Controllers/AcnooSupplierDueReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooSupplierDueReportController.php @@ -35,52 +35,82 @@ public function index(Request $request) ->with('purchases_dues') ->latest(); - $parties = $query - ->paginate($request->per_page ?? 20) - ->appends($request->query()); + // Branch-aware due filter + if ($activeBranch) { + $query->whereHas('purchases_dues', function ($q) use ($activeBranch) { + $q->where('branch_id', $activeBranch->id) + ->where('dueAmount', '>', 0); + }); + } else { + $query->where('due', '>', 0); + } + $parties = $query->paginate($request->per_page ?? 20); + + // Replace $supplier->due with branch-specific due if active branch exists if ($activeBranch) { $parties->setCollection( $parties->getCollection() ->transform(function ($supplier) use ($activeBranch) { - $party_due = $supplier->purchases_dues + $supplier->due = $supplier->purchases_dues ->where('branch_id', $activeBranch->id) ->sum('dueAmount'); - - if ($supplier->branch_id === $activeBranch->id) { - $openingBalanceDue = $supplier->opening_balance_type === 'due' - ? ($supplier->opening_balance ?? 0) - : 0; - - $supplier->due = $openingBalanceDue + $party_due; - } else { - $supplier->due = $party_due; - } - return $supplier; }) ->filter(fn($supplier) => $supplier->due > 0) ->values() ); + } + + // Calculate total_due + $total_due = $parties->sum(function ($supplier) { + return $supplier->due; + }); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('business::reports.supplier-due.datas', compact('parties', 'total_due'))->render() + ]); + } + + if ($activeBranch) { + // Filter parties that have branch-specific due > 0 + $query->whereHas('purchases_dues', function ($q) use ($activeBranch) { + $q->where('branch_id', $activeBranch->id) + ->where('dueAmount', '>', 0); + }); } else { + $query->where('due', '>', 0); + } + + $parties = $query->paginate(20)->appends($request->query()); + + // Calculate total due + $total_due = $parties->sum(function ($supplier) use ($activeBranch) { + if ($activeBranch) { + return $supplier->purchases_dues + ->where('branch_id', $activeBranch->id) + ->sum('dueAmount'); + } + return $supplier->due; + }); + + // Replace $supplier->due with branch-specific due if active branch exists + if ($activeBranch) { $parties->setCollection( $parties->getCollection() - ->filter(fn($supplier) => ($supplier->due ?? 0) > 0) + ->transform(function ($supplier) use ($activeBranch) { + $supplier->due = $supplier->purchases_dues + ->where('branch_id', $activeBranch->id) + ->sum('dueAmount'); + return $supplier; + }) + ->filter(fn($supplier) => $supplier->due > 0) ->values() ); } - $supplier_total_due = $parties->getCollection()->sum('due'); - - if ($request->ajax()) { - - return response()->json([ - 'data' => view('business::reports.supplier-due.datas', compact('parties'))->render(), - 'supplier_total_due' => currency_format($supplier_total_due, currency: business_currency()) - ]); - } - - return view('business::reports.supplier-due.due-reports', compact('parties', 'supplier_total_due')); + return view('business::reports.supplier-due.due-reports', compact('parties', 'total_due')); } public function exportExcel() @@ -93,7 +123,7 @@ public function exportCsv() return Excel::download(new ExportSupplierDue, 'supplier-due.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { $user = auth()->user(); $businessId = $user->business_id; @@ -101,48 +131,29 @@ public function exportPdf(Request $request) $query = Party::where('business_id', $businessId) ->where('type', 'Supplier') - ->when($request->search, function ($q) use ($request) { - $q->where(function ($q2) use ($request) { - $q2->where('type', 'like', '%' . $request->search . '%') - ->orWhere('name', 'like', '%' . $request->search . '%') - ->orWhere('phone', 'like', '%' . $request->search . '%') - ->orWhere('credit_limit', 'like', '%' . $request->search . '%'); - }); - }) ->with('purchases_dues') ->latest(); + if ($activeBranch) { + $query->whereHas('purchases_dues', function ($q) use ($activeBranch) { + $q->where('branch_id', $activeBranch->id) + ->where('dueAmount', '>', 0); + }); + } else { + $query->where('due', '>', 0); + } + $parties = $query->get(); if ($activeBranch) { - $parties = $parties - ->transform(function ($supplier) use ($activeBranch) { - $party_due = $supplier->purchases_dues - ->where('branch_id', $activeBranch->id) - ->sum('dueAmount'); - - if ($supplier->branch_id === $activeBranch->id) { - $openingBalanceDue = $supplier->opening_balance_type === 'due' - ? ($supplier->opening_balance ?? 0) - : 0; - - $supplier->due = $openingBalanceDue + $party_due; - } else { - $supplier->due = $party_due; - } - - return $supplier; - }) - ->filter(fn($supplier) => $supplier->due > 0) - ->take($request->per_page ?? 20) - ->values(); - } else { - $parties = $parties - ->filter(fn($supplier) => ($supplier->due ?? 0) > 0) - ->take($request->per_page ?? 20) - ->values(); + $parties->transform(function ($supplier) use ($activeBranch) { + $supplier->due = $supplier->purchases_dues + ->where('branch_id', $activeBranch->id) + ->sum('dueAmount'); + return $supplier; + })->filter(fn($supplier) => $supplier->due > 0); } - return PdfService::render('business::reports.supplier-due.pdf', compact('parties'), 'supplier-due-report.pdf'); + return PdfService::render('business::reports.supplier-due.pdf', compact('parties'),'supplier-due-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooTopProductReportController.php b/Modules/Business/App/Http/Controllers/AcnooTopProductReportController.php index 334a7232..92835766 100644 --- a/Modules/Business/App/Http/Controllers/AcnooTopProductReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooTopProductReportController.php @@ -23,7 +23,7 @@ public function index(Request $request) } $top_products = SaleDetails::query() - ->with('product:id,productName,productCode,hsn_code') + ->with('product:id,productName,productCode') ->whereHas('product', function ($q) use ($businessId) { $q->where('business_id', $businessId); }) @@ -67,41 +67,28 @@ public function exportCsv() return Excel::download(new ExportTopProduct, 'top-products.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $user = auth()->user(); - $businessId = $user->business_id; + $branchId = moduleCheck('MultiBranchAddon') ? auth()->user()->branch_id ?? auth()->user()->active_branch_id : null; - $branchId = null; - if (moduleCheck('MultiBranchAddon')) { - $branchId = $user->branch_id ?? $user->active_branch_id; - } - - $top_products = SaleDetails::query() - ->with('product:id,productName,productCode,hsn_code') - ->whereHas('product', function ($q) use ($businessId) { - $q->where('business_id', $businessId); - }) - ->when($request->filled('search'), function ($q) use ($request) { - $q->whereHas('product', function ($q) use ($request) { - $q->where('productName', 'like', "%{$request->search}%") - ->orWhere('productCode', 'like', "%{$request->search}%"); - }); - }) - ->when($branchId, function ($q) use ($branchId) { - $q->whereHas('sale', function ($q) use ($branchId) { - $q->where('branch_id', $branchId); - }); - }) - ->select( - 'product_id', - DB::raw('SUM(quantities) as total_sold_qty'), - DB::raw('SUM((price - discount) * quantities) as total_sale_amount') - ) - ->groupBy('product_id') - ->orderByDesc('total_sold_qty') - ->limit(5) - ->get(); + $top_products = SaleDetails::with('product:id,productName,productCode') + ->whereHas('product', function ($q) { + $q->where('business_id', auth()->user()->business_id); + }) + ->when($branchId, function ($q) use ($branchId) { + $q->whereHas('sale', function ($sale) use ($branchId) { + $sale->where('branch_id', $branchId); + }); + }) + ->select( + 'product_id', + DB::raw('SUM(quantities) as total_sold_qty'), + DB::raw('SUM(price * quantities) as total_sale_amount') + ) + ->groupBy('product_id') + ->orderByDesc('total_sold_qty') + ->take(5) + ->get(); return PdfService::render('business::reports.top-products.pdf', compact('top_products'),'top-product-report.pdf'); } diff --git a/Modules/Business/App/Http/Controllers/AcnooTransactionHistoryReportController.php b/Modules/Business/App/Http/Controllers/AcnooTransactionHistoryReportController.php index 2340e7da..8f11d392 100644 --- a/Modules/Business/App/Http/Controllers/AcnooTransactionHistoryReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooTransactionHistoryReportController.php @@ -8,6 +8,7 @@ use App\Services\PdfService; use App\Traits\DateFilterTrait; use App\Traits\DateRangeTrait; +use Illuminate\Support\Carbon; use Maatwebsite\Excel\Facades\Excel; use Modules\Business\App\Exports\ExportTransaction; @@ -23,6 +24,15 @@ public function __construct() public function index(Request $request) { $businessId = auth()->user()->business_id; + $today = Carbon::today()->format('Y-m-d'); + + $total_due = DueCollect::where('business_id', $businessId) + ->whereDate('paymentDate', $today) + ->sum('totalDue'); + + $total_paid = DueCollect::where('business_id', $businessId) + ->whereDate('paymentDate', $today) + ->sum('payDueAmount'); $transactionsQuery = DueCollect::with('party:id,name,type', 'payment_type:id,name', 'transactions')->where('business_id', $businessId); @@ -83,44 +93,12 @@ public function exportCsv() return Excel::download(new ExportTransaction, 'transaction-history.csv'); } - public function exportPdf(Request $request) + public function exportPdf() { - $businessId = auth()->user()->business_id; + $transactions = DueCollect::with('party:id,name,type', 'payment_type:id,name', 'transactions')->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); - $transactionsQuery = DueCollect::with('party:id,name,type', 'payment_type:id,name', 'transactions')->where('business_id', $businessId); - - // Date Filter - $duration = $request->custom_days ?: 'today'; - [$filter_from_date, $filter_to_date] = $this->applyDateRange($duration, $request->from_date, $request->to_date); - - $this->applyDateFilter($transactionsQuery, $duration, 'paymentDate', $request->from_date, $request->to_date); - - // Search Filter - if ($request->filled('search')) { - $transactionsQuery->where(function ($query) use ($request) { - $query->where('paymentType', 'like', '%' . $request->search . '%') - ->orWhere('totalDue', 'like', '%' . $request->search . '%') - ->orWhere('invoiceNumber', 'like', '%' . $request->search . '%') - ->orWhere('payDueAmount', 'like', '%' . $request->search . '%') - ->orWhereHas('party', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }) - ->orWhereHas('payment_type', function ($q) use ($request) { - $q->where('name', 'like', '%' . $request->search . '%'); - }); - }); - } - - if ($request->filled('type')) { - $transactionsQuery->whereHas('party', function ($q) use ($request) { - $q->where(function ($q) use ($request) { - $q->where('type', $request->type); - }); - }); - } - - $transactions = $transactionsQuery->latest()->limit($request->per_page)->get(); - - return PdfService::render('business::reports.transaction-history.pdf', compact('transactions', 'duration', 'filter_from_date', 'filter_to_date'),'due-transactions-report.pdf'); + return PdfService::render('business::reports.transaction-history.pdf', compact('transactions'),'due-transactions-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/AcnooVatReportController.php b/Modules/Business/App/Http/Controllers/AcnooVatReportController.php index 7d247a94..db1f7fa7 100644 --- a/Modules/Business/App/Http/Controllers/AcnooVatReportController.php +++ b/Modules/Business/App/Http/Controllers/AcnooVatReportController.php @@ -2,20 +2,16 @@ namespace Modules\Business\App\Http\Controllers; -use App\Http\Controllers\Controller; -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; +use App\Models\Sale; +use App\Models\Purchase; +use App\Http\Controllers\Controller; use App\Services\PdfService; use App\Traits\DateFilterTrait; use App\Traits\DateRangeTrait; use Illuminate\Http\Request; use Maatwebsite\Excel\Facades\Excel; -use Modules\Business\App\Exports\ExportTaxReport; +use Modules\Business\App\Exports\ExportVatReport; class AcnooVatReportController extends Controller { @@ -29,441 +25,134 @@ public function __construct() public function index(Request $request) { $businessId = auth()->user()->business_id; - - $vats = Vat::where('business_id', $businessId) - ->whereStatus(1) - ->get(); + $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' - ]); + $salesQuery = Sale::with('user:id,name', 'party:id,name,email,phone,type', 'business:id,companyName', 'payment_type:id,name', 'transactions') + ->where('business_id', $businessId) + ->where('vat_amount', '>', 0); - $this->applyDateFilter( - $salesQuery, - $duration, - 'saleDate', - $request->from_date, - $request->to_date - ); + // Date Filter + $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(20, ['*'], 'sales'); + + $salesVatTotals = []; + foreach ($vats as $vat) { + $salesVatTotals[$vat->id] = (clone $salesQuery)->where('vat_id', $vat->id)->sum('vat_amount'); } - $sales = $salesQuery->latest()->paginate($request->per_page ?? 20, ['*'], 'sales')->appends($request->query()); + $purchasesQuery = Purchase::with('details', 'party', 'details.product', 'details.product.category', 'payment_type:id,name', 'transactions') + ->where('business_id', $businessId) + ->where('vat_amount', '>', 0); - $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(); + // Date Filter + $this->applyDateFilter($purchasesQuery, $duration, 'purchaseDate', $request->from_date, $request->to_date); - $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(); + $purchases = $purchasesQuery->latest()->paginate(20, ['*'], 'purchases'); - $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 . '%')); - }); + $purchasesVatTotals = []; + foreach ($vats as $vat) { + $purchasesVatTotals[$vat->id] = (clone $purchasesQuery)->where('vat_id', $vat->id)->sum('vat_amount'); } - $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(), + 'sale_data' => view('business::reports.vats.sale-datas', compact('sales', 'salesVatTotals', 'vats', 'filter_from_date', 'filter_to_date', 'duration'))->render(), + 'purchase_data' => view('business::reports.vats.purchase-datas', compact('purchases', 'purchasesVatTotals', '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' - )); + return view('business::reports.vats.index', compact('sales', 'salesVatTotals', 'purchases', 'purchasesVatTotals', 'vats', 'filter_from_date', 'filter_to_date', 'duration')); } - public function exportExcel() + public function exportExcel($type = 'all') { - return Excel::download(new ExportTaxReport, 'tax-report.xlsx'); + return $this->exportFile($type, 'vat-report.xlsx'); } - public function exportCsv() + public function exportCsv($type = 'all') { - return Excel::download(new ExportTaxReport, 'tax-report.csv'); + return $this->exportFile($type, 'vat-report.csv'); } - public function exportPdf(Request $request) + private function exportFile($type, $filename, $format = null) { $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 === 'sales' || $type === 'all') { + $sales = Sale::with('user:id,name', 'party:id,name,email,phone,type', 'payment_type:id,name', 'transactions') + ->where('business_id', $businessId) + ->where('vat_amount', '>', 0) + ->latest() + ->get(); } - if ($type === 'purchases') { - $purchases = $purchasesQuery->latest()->limit($limit)->get(); + if ($type === 'purchases' || $type === 'all') { + $purchases = Purchase::with('details', 'party', 'details.product', 'details.product.category', 'payment_type:id,name', 'transactions') + ->where('business_id', $businessId) + ->where('vat_amount', '>', 0) + ->latest() + ->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' - ); + $salesVatTotals = []; + foreach ($vats as $vat) { + $salesVatTotals[$vat->id] = $sales->where('vat_id', $vat->id)->sum('vat_amount'); + } + + $purchasesVatTotals = []; + foreach ($vats as $vat) { + $purchasesVatTotals[$vat->id] = $purchases->where('vat_id', $vat->id)->sum('vat_amount'); + } + + $export = new ExportVatReport($sales, $purchases, $vats, $salesVatTotals, $purchasesVatTotals); + + return Excel::download($export, $filename, $format); + } + + public function exportPdf($type = 'all') + { + $businessId = auth()->user()->business_id; + + $sales = collect(); + $purchases = collect(); + + if ($type === 'sales' || $type === 'all') { + $sales = Sale::with('party', 'payment_type') + ->where('business_id', $businessId) + ->where('vat_amount', '>', 0) + ->latest() + ->get(); + } + + if ($type === 'purchases' || $type === 'all') { + $purchases = Purchase::with('party', 'payment_type') + ->where('business_id', $businessId) + ->where('vat_amount', '>', 0) + ->latest() + ->get(); + } + + $vats = Vat::where('business_id', $businessId)->get(); + + $salesVatTotals = []; + foreach ($vats as $vat) { + $salesVatTotals[$vat->id] = $sales->where('vat_id', $vat->id)->sum('vat_amount'); + } + + $purchasesVatTotals = []; + foreach ($vats as $vat) { + $purchasesVatTotals[$vat->id] = $purchases->where('vat_id', $vat->id)->sum('vat_amount'); + } + + return PdfService::render('business::reports.vats.pdf', compact('sales', 'salesVatTotals', 'purchases', 'purchasesVatTotals', 'vats', 'type'),'vats-report.pdf'); } } diff --git a/Modules/Business/App/Http/Controllers/DashboardController.php b/Modules/Business/App/Http/Controllers/DashboardController.php index 3bfb958d..73696a71 100644 --- a/Modules/Business/App/Http/Controllers/DashboardController.php +++ b/Modules/Business/App/Http/Controllers/DashboardController.php @@ -17,6 +17,7 @@ use App\Models\PurchaseReturnDetail; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\DB; class DashboardController extends Controller { diff --git a/Modules/Business/resources/views/balance-sheets/index.blade.php b/Modules/Business/resources/views/balance-sheets/index.blade.php index 0f11e59a..5ee0cd25 100644 --- a/Modules/Business/resources/views/balance-sheets/index.blade.php +++ b/Modules/Business/resources/views/balance-sheets/index.blade.php @@ -76,17 +76,17 @@
{{ __('Duration:') }} - @if ($duration === 'today') - {{ Carbon\Carbon::parse($filter_from_date)->format('d-m-Y') }} - @elseif ($duration === 'yesterday') - {{ Carbon\Carbon::parse($filter_from_date)->format('d-m-Y') }} - @else - {{ Carbon\Carbon::parse($filter_from_date)->format('d-m-Y') }} - {{ __('to') }} - {{ Carbon\Carbon::parse($filter_to_date)->format('d-m-Y') }} - @endif -
- @endif