215 lines
7.9 KiB
PHP
215 lines
7.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Livewire\Reports;
|
|
|
|
use Livewire\Component;
|
|
use Modules\Expense\Entities\Expense;
|
|
use Modules\Purchase\Entities\Purchase;
|
|
use Modules\Purchase\Entities\PurchasePayment;
|
|
use Modules\PurchasesReturn\Entities\PurchaseReturn;
|
|
use Modules\PurchasesReturn\Entities\PurchaseReturnPayment;
|
|
use Modules\Sale\Entities\Sale;
|
|
use Modules\Sale\Entities\SalePayment;
|
|
use Modules\SalesReturn\Entities\SaleReturn;
|
|
use Modules\SalesReturn\Entities\SaleReturnPayment;
|
|
|
|
class ProfitLossReport extends Component
|
|
{
|
|
|
|
public $start_date;
|
|
public $end_date;
|
|
public $total_sales, $sales_amount;
|
|
public $total_purchases, $purchases_amount;
|
|
public $total_sale_returns, $sale_returns_amount;
|
|
public $total_purchase_returns, $purchase_returns_amount;
|
|
public $expenses_amount;
|
|
public $profit_amount;
|
|
public $payments_received_amount;
|
|
public $payments_sent_amount;
|
|
public $payments_net_amount;
|
|
|
|
protected $rules = [
|
|
'start_date' => '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;
|
|
}
|
|
}
|