finishing to dev
All checks were successful
All checks were successful
This commit is contained in:
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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'
|
||||
);
|
||||
|
||||
@@ -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'
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'));
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user