finishing to dev
All checks were successful
Build, Push and Deploy / build-and-push (push) Successful in 3m41s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
Build, Push and Deploy / deploy-staging (push) Successful in 42s
Build, Push and Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-05-14 22:50:44 +07:00
parent 2fabdf8fc9
commit 8307b9e66d
212 changed files with 2451 additions and 4493 deletions

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');

View File

@@ -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'
);

View File

@@ -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'
));
}

View File

@@ -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)

View File

@@ -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();

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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'));

View File

@@ -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');
}
}

View File

@@ -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');
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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
{