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')
+
+ - Home
+ - Profit Loss Report
+
+@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')