From a5b28237ba9b522585d3f4a20923556d415461c2 Mon Sep 17 00:00:00 2001 From: Fahim Date: Thu, 9 Sep 2021 18:41:37 +0600 Subject: [PATCH] Added: Profit / Loss Report --- Modules/Purchase/Entities/Purchase.php | 4 + .../Entities/PurchaseReturn.php | 4 + .../Http/Controllers/ReportsController.php | 7 +- .../views/profit-loss/index.blade.php | 16 ++ Modules/Reports/Routes/web.php | 3 + Modules/Sale/Entities/Sale.php | 4 + Modules/SalesReturn/Entities/SaleReturn.php | 4 + app/Http/Controllers/HomeController.php | 8 +- app/Http/Livewire/Reports/PaymentsReport.php | 6 + .../Livewire/Reports/ProfitLossReport.php | 214 ++++++++++++++++++ resources/views/layouts/menu.blade.php | 9 +- .../reports/profit-loss-report.blade.php | 168 ++++++++++++++ 12 files changed, 441 insertions(+), 6 deletions(-) create mode 100644 Modules/Reports/Resources/views/profit-loss/index.blade.php create mode 100644 app/Http/Livewire/Reports/ProfitLossReport.php create mode 100644 resources/views/livewire/reports/profit-loss-report.blade.php diff --git a/Modules/Purchase/Entities/Purchase.php b/Modules/Purchase/Entities/Purchase.php index d5100468..c7af85f6 100644 --- a/Modules/Purchase/Entities/Purchase.php +++ b/Modules/Purchase/Entities/Purchase.php @@ -28,6 +28,10 @@ class Purchase extends Model }); } + public function scopeCompleted($query) { + return $query->where('status', 'Completed'); + } + public function getShippingAmountAttribute($value) { return $value / 100; } diff --git a/Modules/PurchasesReturn/Entities/PurchaseReturn.php b/Modules/PurchasesReturn/Entities/PurchaseReturn.php index c683bc63..463dff4f 100644 --- a/Modules/PurchasesReturn/Entities/PurchaseReturn.php +++ b/Modules/PurchasesReturn/Entities/PurchaseReturn.php @@ -28,6 +28,10 @@ class PurchaseReturn extends Model }); } + public function scopeCompleted($query) { + return $query->where('status', 'Completed'); + } + public function getShippingAmountAttribute($value) { return $value / 100; } diff --git a/Modules/Reports/Http/Controllers/ReportsController.php b/Modules/Reports/Http/Controllers/ReportsController.php index cda4692b..0efd73af 100644 --- a/Modules/Reports/Http/Controllers/ReportsController.php +++ b/Modules/Reports/Http/Controllers/ReportsController.php @@ -2,7 +2,6 @@ namespace Modules\Reports\Http\Controllers; -use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Gate; @@ -10,6 +9,12 @@ use Illuminate\Support\Facades\Gate; class ReportsController extends Controller { + public function profitLossReport() { + abort_if(Gate::denies('access_profit_loss_report'), 403); + + return view('reports::profit-loss.index'); + } + public function paymentsReport() { abort_if(Gate::denies('access_payments_report'), 403); diff --git a/Modules/Reports/Resources/views/profit-loss/index.blade.php b/Modules/Reports/Resources/views/profit-loss/index.blade.php new file mode 100644 index 00000000..d176fccf --- /dev/null +++ b/Modules/Reports/Resources/views/profit-loss/index.blade.php @@ -0,0 +1,16 @@ +@extends('layouts.app') + +@section('title', 'Profit / Loss Report') + +@section('breadcrumb') + +@endsection + +@section('content') +
+ +
+@endsection diff --git a/Modules/Reports/Routes/web.php b/Modules/Reports/Routes/web.php index 6d6b511d..db19d38a 100644 --- a/Modules/Reports/Routes/web.php +++ b/Modules/Reports/Routes/web.php @@ -12,6 +12,9 @@ */ Route::group(['middleware' => 'auth'], function () { + //Profit Loss Report + Route::get('/profit-loss-report', 'ReportsController@profitLossReport') + ->name('profit-loss-report.index'); //Payments Report Route::get('/payments-report', 'ReportsController@paymentsReport') ->name('payments-report.index'); diff --git a/Modules/Sale/Entities/Sale.php b/Modules/Sale/Entities/Sale.php index 1b803165..9998fb8a 100644 --- a/Modules/Sale/Entities/Sale.php +++ b/Modules/Sale/Entities/Sale.php @@ -28,6 +28,10 @@ class Sale extends Model }); } + public function scopeCompleted($query) { + return $query->where('status', 'Completed'); + } + public function getShippingAmountAttribute($value) { return $value / 100; } diff --git a/Modules/SalesReturn/Entities/SaleReturn.php b/Modules/SalesReturn/Entities/SaleReturn.php index 3ccc6e54..7a98dad5 100644 --- a/Modules/SalesReturn/Entities/SaleReturn.php +++ b/Modules/SalesReturn/Entities/SaleReturn.php @@ -28,6 +28,10 @@ class SaleReturn extends Model }); } + public function scopeCompleted($query) { + return $query->where('status', 'Completed'); + } + public function getShippingAmountAttribute($value) { return $value / 100; } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 0ee895e0..e037e79e 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -20,12 +20,12 @@ class HomeController extends Controller { public function index() { - $sales = Sale::where('status', 'Completed')->sum('total_amount'); - $sale_returns = SaleReturn::where('status', 'Completed')->sum('total_amount'); - $purchase_returns = PurchaseReturn::where('status', 'Completed')->sum('total_amount'); + $sales = Sale::completed()->sum('total_amount'); + $sale_returns = SaleReturn::completed()->sum('total_amount'); + $purchase_returns = PurchaseReturn::completed()->sum('total_amount'); $product_costs = 0; - foreach (Sale::where('status', 'Completed')->with('saleDetails')->get() as $sale) { + foreach (Sale::completed()->with('saleDetails')->get() as $sale) { foreach ($sale->saleDetails as $saleDetail) { $product_costs += $saleDetail->product->product_cost; } diff --git a/app/Http/Livewire/Reports/PaymentsReport.php b/app/Http/Livewire/Reports/PaymentsReport.php index 437cc9b3..4940b49b 100644 --- a/app/Http/Livewire/Reports/PaymentsReport.php +++ b/app/Http/Livewire/Reports/PaymentsReport.php @@ -42,6 +42,12 @@ class PaymentsReport extends Component return view('livewire.reports.payments-report', [ 'information' => $this->query ? $this->query->orderBy('date', 'desc') + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) ->when($this->payment_method, function ($query) { return $query->where('payment_method', $this->payment_method); }) diff --git a/app/Http/Livewire/Reports/ProfitLossReport.php b/app/Http/Livewire/Reports/ProfitLossReport.php new file mode 100644 index 00000000..172e1048 --- /dev/null +++ b/app/Http/Livewire/Reports/ProfitLossReport.php @@ -0,0 +1,214 @@ + 'required|date|before:end_date', + 'end_date' => 'required|date|after:start_date' + ]; + + public function mount() { + $this->start_date = ''; + $this->end_date = ''; + $this->total_sales = 0; + $this->sales_amount = 0; + $this->total_sale_returns = 0; + $this->sale_returns_amount = 0; + $this->total_purchases = 0; + $this->purchases_amount = 0; + $this->total_purchase_returns = 0; + $this->purchase_returns_amount = 0; + $this->payments_received_amount = 0; + $this->payments_sent_amount = 0; + $this->payments_net_amount = 0; + } + + public function render() { + $this->setValues(); + + return view('livewire.reports.profit-loss-report'); + } + + public function generateReport() { + $this->validate(); + } + + public function setValues() { + $this->total_sales = Sale::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->count(); + + $this->sales_amount = Sale::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('total_amount') / 100; + + $this->total_purchases = Purchase::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->count(); + + $this->purchases_amount = Purchase::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('total_amount') / 100; + + $this->total_sale_returns = SaleReturn::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->count(); + + $this->sale_returns_amount = SaleReturn::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('total_amount') / 100; + + $this->total_purchase_returns = PurchaseReturn::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->count(); + + $this->purchase_returns_amount = PurchaseReturn::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('total_amount') / 100; + + $this->expenses_amount = Expense::when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('amount') / 100; + + $this->profit_amount = $this->calculateProfit(); + + $this->payments_received_amount = $this->calculatePaymentsReceived(); + + $this->payments_sent_amount = $this->calculatePaymentsSent(); + + $this->payments_net_amount = $this->payments_received_amount - $this->payments_sent_amount; + } + + public function calculateProfit() { + $product_costs = 0; + $revenue = $this->sales_amount - $this->sale_returns_amount; + $sales = Sale::completed() + ->when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->with('saleDetails')->get(); + + foreach ($sales as $sale) { + foreach ($sale->saleDetails as $saleDetail) { + $product_costs += $saleDetail->product->product_cost; + } + } + + $profit = $revenue - $product_costs; + + return $profit; + } + + public function calculatePaymentsReceived() { + $sale_payments = SalePayment::when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('amount') / 100; + + $purchase_return_payments = PurchaseReturnPayment::when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('amount') / 100; + + return $sale_payments + $purchase_return_payments; + } + + public function calculatePaymentsSent() { + $purchase_payments = PurchasePayment::when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('amount') / 100; + + $sale_return_payments = SaleReturnPayment::when($this->start_date, function ($query) { + return $query->whereDate('date', '>=', $this->start_date); + }) + ->when($this->end_date, function ($query) { + return $query->whereDate('date', '<=', $this->end_date); + }) + ->sum('amount') / 100; + + return $purchase_payments + $sale_return_payments + $this->expenses_amount; + } +} diff --git a/resources/views/layouts/menu.blade.php b/resources/views/layouts/menu.blade.php index 7407153e..2f528451 100644 --- a/resources/views/layouts/menu.blade.php +++ b/resources/views/layouts/menu.blade.php @@ -233,12 +233,19 @@ @endcan -@can('access_sales_report|access_purchases_report|access_sales_return_report|access_purchases_return_report|access_payments_reports') +@can('access_sales_report|access_purchases_report|access_sales_return_report|access_purchases_return_report|access_payments_reports|access_profit_loss_report')
  • Reports