Files
kulakpos_web/Modules/Business/App/Http/Controllers/AcnooLossProfitHistoryController.php

325 lines
12 KiB
PHP
Raw Normal View History

2026-03-15 17:08:23 +07:00
<?php
namespace Modules\Business\App\Http\Controllers;
use Illuminate\Http\Request;
use App\Traits\DateFilterTrait;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use App\Services\PdfService;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Business\App\Exports\ExportLossProfitHistory;
class AcnooLossProfitHistoryController extends Controller
{
2026-05-14 22:50:44 +07:00
use DateFilterTrait;
2026-03-15 17:08:23 +07:00
public function index(Request $request)
{
$user = auth()->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(
2026-05-14 22:50:44 +07:00
DB::raw('DATE("saleDate") as date'),
2026-03-15 17:08:23 +07:00
DB::raw('SUM(actual_total_amount) as total_sales'),
2026-04-23 22:17:41 +07:00
DB::raw('SUM("lossProfit") as total_sale_income')
2026-03-15 17:08:23 +07:00
)
->where('business_id', $businessId)
->when($branchId, fn ($q) =>
2026-05-14 22:50:44 +07:00
$q->where('branch_id', $branchId)
2026-03-15 17:08:23 +07:00
)
2026-05-14 22:50:44 +07:00
->groupBy(DB::raw('DATE("saleDate")'));
2026-03-15 17:08:23 +07:00
$this->applyDateFilter($salesQuery, $duration, 'saleDate', $request->from_date, $request->to_date);
2026-05-14 22:50:44 +07:00
$dailySales = $salesQuery->get();
2026-03-15 17:08:23 +07:00
$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(
2026-05-14 22:50:44 +07:00
DB::raw('DATE("incomeDate") as date'),
2026-03-15 17:08:23 +07:00
DB::raw('SUM(amount) as total_incomes')
)
->where('business_id', $businessId)
->when($branchId, fn ($q) =>
$q->where('branch_id', $branchId)
)
2026-05-14 22:50:44 +07:00
->groupBy(DB::raw('DATE("incomeDate")'));
2026-03-15 17:08:23 +07:00
$this->applyDateFilter($incomeQuery, $duration, 'incomeDate', $request->from_date, $request->to_date);
2026-05-14 22:50:44 +07:00
$dailyIncomes = $incomeQuery->get();
2026-03-15 17:08:23 +07:00
$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);
}
2026-05-14 22:50:44 +07:00
if ($sale = $sale_datas->firstWhere('date', $date)) {
2026-03-15 17:08:23 +07:00
$mergedIncomeSaleData->push($sale);
}
}
$dailyPayrolls = collect();
if (moduleCheck('HrmAddon')) {
$payrollQuery = DB::table('payrolls')
->select(
2026-05-14 22:50:44 +07:00
DB::raw('DATE("date") as date'),
2026-03-15 17:08:23 +07:00
DB::raw('SUM(amount) as total_payrolls')
)
->where('business_id', $businessId)
->when($branchId, fn ($q) =>
$q->where('branch_id', $branchId)
)
2026-05-14 22:50:44 +07:00
->groupBy(DB::raw('DATE("date")'));
2026-03-15 17:08:23 +07:00
$this->applyDateFilter($payrollQuery, $duration, 'date', $request->from_date, $request->to_date);
2026-05-14 22:50:44 +07:00
$dailyPayrolls = $payrollQuery->get();
2026-03-15 17:08:23 +07:00
}
$expenseQuery = DB::table('expenses')
->select(
2026-05-14 22:50:44 +07:00
DB::raw('DATE("expenseDate") as date'),
2026-03-15 17:08:23 +07:00
DB::raw('SUM(amount) as total_expenses_only')
)
->where('business_id', $businessId)
->when($branchId, fn ($q) =>
$q->where('branch_id', $branchId)
)
2026-05-14 22:50:44 +07:00
->groupBy(DB::raw('DATE("expenseDate")'));
2026-03-15 17:08:23 +07:00
$this->applyDateFilter($expenseQuery, $duration, 'expenseDate', $request->from_date, $request->to_date);
2026-05-14 22:50:44 +07:00
$dailyExpenses = $expenseQuery->get();
2026-03-15 17:08:23 +07:00
$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;
2026-05-14 22:50:44 +07:00
$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;
2026-03-15 17:08:23 +07:00
return view('business::loss-profit-histories.index', compact(
'mergedIncomeSaleData',
'mergedExpenseData',
'grossSaleProfit',
'grossIncomeProfit',
'totalExpenses',
'netProfit',
2026-05-14 22:50:44 +07:00
'cardGrossProfit',
'totalCardExpenses',
'cardNetProfit'
2026-03-15 17:08:23 +07:00
));
}
public function exportExcel()
{
return Excel::download(new ExportLossProfitHistory, 'loss-profit-history.xlsx');
}
public function exportCsv()
{
return Excel::download(new ExportLossProfitHistory, 'loss-profit-history.csv');
}
2026-05-14 22:50:44 +07:00
public function exportPdf()
2026-03-15 17:08:23 +07:00
{
$user = auth()->user();
$businessId = $user->business_id;
$branchId = null;
if (moduleCheck('MultiBranchAddon')) {
$branchId = $user->branch_id ?? $user->active_branch_id;
}
2026-05-14 22:50:44 +07:00
// SALES
$dailySales = DB::table('sales')
2026-03-15 17:08:23 +07:00
->select(
2026-05-14 22:50:44 +07:00
DB::raw('DATE("saleDate") as date'),
2026-03-15 17:08:23 +07:00
DB::raw('SUM(actual_total_amount) as total_sales'),
2026-04-23 22:17:41 +07:00
DB::raw('SUM("lossProfit") as total_sale_income')
2026-03-15 17:08:23 +07:00
)
->where('business_id', $businessId)
2026-05-14 22:50:44 +07:00
->when($branchId, fn ($q) => $q->where('branch_id', $branchId))
->groupBy(DB::raw('DATE(saleDate)'))
->get();
2026-03-15 17:08:23 +07:00
$sale_datas = $dailySales->map(fn ($sale) => (object)[
2026-05-14 22:50:44 +07:00
'type' => 'Sale',
'date' => $sale->date,
'total_sales' => $sale->total_sales,
'total_incomes' => $sale->total_sale_income,
2026-03-15 17:08:23 +07:00
]);
2026-05-14 22:50:44 +07:00
// INCOME
$dailyIncomes = DB::table('incomes')
2026-03-15 17:08:23 +07:00
->select(
2026-05-14 22:50:44 +07:00
DB::raw('DATE("incomeDate") as date'),
2026-03-15 17:08:23 +07:00
DB::raw('SUM(amount) as total_incomes')
)
->where('business_id', $businessId)
2026-05-14 22:50:44 +07:00
->when($branchId, fn ($q) => $q->where('branch_id', $branchId))
->groupBy(DB::raw('DATE(incomeDate)'))
->get();
2026-03-15 17:08:23 +07:00
$income_datas = $dailyIncomes->map(fn ($income) => (object)[
2026-05-14 22:50:44 +07:00
'type' => 'Income',
'date' => $income->date,
2026-03-15 17:08:23 +07:00
'total_incomes' => $income->total_incomes,
]);
2026-05-14 22:50:44 +07:00
// MERGE SALE + INCOME
2026-03-15 17:08:23 +07:00
$mergedIncomeSaleData = collect();
2026-05-14 22:50:44 +07:00
$allDates = $dailySales->pluck('date')->merge($dailyIncomes->pluck('date'))->unique()->sort();
2026-03-15 17:08:23 +07:00
foreach ($allDates as $date) {
if ($income = $income_datas->firstWhere('date', $date)) {
$mergedIncomeSaleData->push($income);
}
2026-05-14 22:50:44 +07:00
if ($sale = $sale_datas->firstWhere('date', $date)) {
2026-03-15 17:08:23 +07:00
$mergedIncomeSaleData->push($sale);
}
}
2026-05-14 22:50:44 +07:00
// PAYROLL
2026-03-15 17:08:23 +07:00
$dailyPayrolls = collect();
if (moduleCheck('HrmAddon')) {
2026-05-14 22:50:44 +07:00
$dailyPayrolls = DB::table('payrolls')
2026-03-15 17:08:23 +07:00
->select(
2026-05-14 22:50:44 +07:00
DB::raw('DATE("date") as date'),
2026-03-15 17:08:23 +07:00
DB::raw('SUM(amount) as total_payrolls')
)
->where('business_id', $businessId)
2026-05-14 22:50:44 +07:00
->when($branchId, fn ($q) => $q->where('branch_id', $branchId))
->groupBy(DB::raw('DATE(date)'))
->get();
2026-03-15 17:08:23 +07:00
}
2026-05-14 22:50:44 +07:00
// EXPENSES
$dailyExpenses = DB::table('expenses')
2026-03-15 17:08:23 +07:00
->select(
2026-05-14 22:50:44 +07:00
DB::raw('DATE("expenseDate") as date'),
2026-03-15 17:08:23 +07:00
DB::raw('SUM(amount) as total_expenses_only')
)
->where('business_id', $businessId)
2026-05-14 22:50:44 +07:00
->when($branchId, fn ($q) => $q->where('branch_id', $branchId))
->groupBy(DB::raw('DATE(expenseDate)'))
->get();
2026-03-15 17:08:23 +07:00
$mergedExpenseData = collect();
2026-05-14 22:50:44 +07:00
$allExpenseDates = $dailyExpenses->pluck('date')->merge($dailyPayrolls->pluck('date'))->unique()->sort();
2026-03-15 17:08:23 +07:00
foreach ($allExpenseDates as $date) {
if ($expense = $dailyExpenses->firstWhere('date', $date)) {
$mergedExpenseData->push((object)[
2026-05-14 22:50:44 +07:00
'type' => 'Expense',
'date' => $date,
2026-03-15 17:08:23 +07:00
'total_expenses' => $expense->total_expenses_only,
]);
}
if ($payroll = $dailyPayrolls->firstWhere('date', $date)) {
$mergedExpenseData->push((object)[
2026-05-14 22:50:44 +07:00
'type' => 'Payroll',
'date' => $date,
2026-03-15 17:08:23 +07:00
'total_expenses' => $payroll->total_payrolls,
]);
}
}
2026-05-14 22:50:44 +07:00
// SUMMARY
2026-03-15 17:08:23 +07:00
$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',
2026-05-14 22:50:44 +07:00
'netProfit'
2026-03-15 17:08:23 +07:00
),
'loss-profit-history.pdf'
);
}
}