325 lines
12 KiB
PHP
325 lines
12 KiB
PHP
|
|
<?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
|
||
|
|
{
|
||
|
|
use DateFilterTrait;
|
||
|
|
|
||
|
|
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(
|
||
|
|
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'
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|