user(); $businessId = $user->business_id; $branchId = null; if (moduleCheck('MultiBranchAddon')) { $branchId = $user->branch_id ?? $user->active_branch_id; } $duration = $request->custom_days ?: 'today'; $salesQuery = DB::table('sales') ->select( 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('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, 'total_sales' => $sale->total_sales, 'total_incomes' => $sale->total_sale_income, ]); $incomeQuery = DB::table('incomes') ->select( 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('DATE(incomeDate)')); $this->applyDateFilter($incomeQuery, $duration, 'incomeDate', $request->from_date, $request->to_date); $dailyIncomes = $incomeQuery->get(); $income_datas = $dailyIncomes->map(fn ($income) => (object)[ 'type' => 'Income', 'date' => $income->date, 'total_incomes' => $income->total_incomes, ]); $mergedIncomeSaleData = collect(); $allDates = $dailySales->pluck('date') ->merge($dailyIncomes->pluck('date')) ->unique() ->sort(); foreach ($allDates as $date) { if ($income = $income_datas->firstWhere('date', $date)) { $mergedIncomeSaleData->push($income); } if ($sale = $sale_datas->firstWhere('date', $date)) { $mergedIncomeSaleData->push($sale); } } $dailyPayrolls = collect(); if (moduleCheck('HrmAddon')) { $payrollQuery = DB::table('payrolls') ->select( 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->get(); } $expenseQuery = DB::table('expenses') ->select( 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('DATE(expenseDate)')); $this->applyDateFilter($expenseQuery, $duration, 'expenseDate', $request->from_date, $request->to_date); $dailyExpenses = $expenseQuery->get(); $mergedExpenseData = collect(); $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, 'total_expenses' => $expense->total_expenses_only, ]); } if ($payroll = $dailyPayrolls->firstWhere('date', $date)) { $mergedExpenseData->push((object)[ 'type' => 'Payroll', 'date' => $date, 'total_expenses' => $payroll->total_payrolls, ]); } } $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; $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', 'grossSaleProfit', 'grossIncomeProfit', 'totalExpenses', 'netProfit', 'cardGrossProfit', 'totalCardExpenses', 'cardNetProfit' )); } public function exportExcel() { return Excel::download(new ExportLossProfitHistory, 'loss-profit-history.xlsx'); } public function exportCsv() { return Excel::download(new ExportLossProfitHistory, 'loss-profit-history.csv'); } public function exportPdf() { $user = auth()->user(); $businessId = $user->business_id; $branchId = null; if (moduleCheck('MultiBranchAddon')) { $branchId = $user->branch_id ?? $user->active_branch_id; } // SALES $dailySales = DB::table('sales') ->select( 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('DATE(saleDate)')) ->get(); $sale_datas = $dailySales->map(fn ($sale) => (object)[ 'type' => 'Sale', 'date' => $sale->date, 'total_sales' => $sale->total_sales, 'total_incomes' => $sale->total_sale_income, ]); // INCOME $dailyIncomes = DB::table('incomes') ->select( 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('DATE(incomeDate)')) ->get(); $income_datas = $dailyIncomes->map(fn ($income) => (object)[ '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(); foreach ($allDates as $date) { if ($income = $income_datas->firstWhere('date', $date)) { $mergedIncomeSaleData->push($income); } if ($sale = $sale_datas->firstWhere('date', $date)) { $mergedIncomeSaleData->push($sale); } } // PAYROLL $dailyPayrolls = collect(); if (moduleCheck('HrmAddon')) { $dailyPayrolls = DB::table('payrolls') ->select( 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)')) ->get(); } // EXPENSES $dailyExpenses = DB::table('expenses') ->select( 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('DATE(expenseDate)')) ->get(); $mergedExpenseData = collect(); $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, 'total_expenses' => $expense->total_expenses_only, ]); } if ($payroll = $dailyPayrolls->firstWhere('date', $date)) { $mergedExpenseData->push((object)[ '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; // RENDER PDF return PdfService::render( 'business::loss-profit-histories.pdf', compact( 'mergedIncomeSaleData', 'mergedExpenseData', 'grossSaleProfit', 'grossIncomeProfit', 'totalExpenses', 'netProfit' ), 'loss-profit-history.pdf' ); } }