added transaction taxes in the tax report
This commit is contained in:
parent
0fceb96078
commit
635fee12ff
|
|
@ -5,12 +5,13 @@ namespace App\Models\Banking;
|
||||||
use App\Abstracts\Model;
|
use App\Abstracts\Model;
|
||||||
use App\Models\Banking\Transaction;
|
use App\Models\Banking\Transaction;
|
||||||
use App\Traits\Currencies;
|
use App\Traits\Currencies;
|
||||||
|
use App\Traits\Transactions;
|
||||||
use Bkwld\Cloner\Cloneable;
|
use Bkwld\Cloner\Cloneable;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
|
||||||
class TransactionTax extends Model
|
class TransactionTax extends Model
|
||||||
{
|
{
|
||||||
use Cloneable, Currencies;
|
use Cloneable, Currencies, Transactions;
|
||||||
|
|
||||||
protected $table = 'transaction_taxes';
|
protected $table = 'transaction_taxes';
|
||||||
|
|
||||||
|
|
@ -31,34 +32,92 @@ class TransactionTax extends Model
|
||||||
return $this->belongsTo('App\Models\Banking\Transaction')->withDefault(['name' => trans('general.na')]);
|
return $this->belongsTo('App\Models\Banking\Transaction')->withDefault(['name' => trans('general.na')]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeType(Builder $query, string $type)
|
public function scopeType(Builder $query, $types): Builder
|
||||||
{
|
{
|
||||||
return $query->where($this->qualifyColumn('type'), '=', $type);
|
if (empty($types)) {
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query->whereIn($this->qualifyColumn('type'), (array) $types);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeIncome(Builder $query)
|
public function scopeIncome(Builder $query)
|
||||||
{
|
{
|
||||||
return $query->where($this->qualifyColumn('type'), '=', Transaction::INCOME_TYPE);
|
return $query->whereIn($this->qualifyColumn('type'), (array) $this->getIncomeTypes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIncomeTransfer(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->where($this->qualifyColumn('type'), '=', Transaction::INCOME_TRANSFER_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeIncomeRecurring(Builder $query): Builder
|
public function scopeIncomeRecurring(Builder $query): Builder
|
||||||
{
|
{
|
||||||
return $query->where($this->qualifyColumn('type'), '=', Transaction::INCOME_RECURRING_TYPE)
|
return $query->where($this->qualifyColumn('type'), '=', Transaction::INCOME_RECURRING_TYPE)
|
||||||
->whereHas('document.recurring', function (Builder $query) {
|
->whereHas('transaction.recurring', function (Builder $query) {
|
||||||
$query->whereNull('deleted_at');
|
$query->whereNull('deleted_at');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeExpense(Builder $query)
|
public function scopeExpense(Builder $query)
|
||||||
{
|
{
|
||||||
return $query->where($this->qualifyColumn('type'), '=', Transaction::EXPENSE_TYPE);
|
return $query->whereIn($this->qualifyColumn('type'), (array) $this->getExpenseTypes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeExpenseTransfer(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->where($this->qualifyColumn('type'), '=', Transaction::EXPENSE_TRANSFER_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scopeExpenseRecurring(Builder $query): Builder
|
public function scopeExpenseRecurring(Builder $query): Builder
|
||||||
{
|
{
|
||||||
return $query->where($this->qualifyColumn('type'), '=', Transaction::EXPENSE_RECURRING_TYPE)
|
return $query->where($this->qualifyColumn('type'), '=', Transaction::EXPENSE_RECURRING_TYPE)
|
||||||
->whereHas('document.recurring', function (Builder $query) {
|
->whereHas('transaction.recurring', function (Builder $query) {
|
||||||
$query->whereNull('deleted_at');
|
$query->whereNull('deleted_at');
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIsTransfer(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->where($this->qualifyColumn('type'), 'like', '%-transfer');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIsNotTransfer(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->where($this->qualifyColumn('type'), 'not like', '%-transfer');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIsRecurring(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->where($this->qualifyColumn('type'), 'like', '%-recurring');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIsNotRecurring(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->where($this->qualifyColumn('type'), 'not like', '%-recurring');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIsSplit(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->where($this->qualifyColumn('type'), 'like', '%-split');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIsNotSplit(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->where($this->qualifyColumn('type'), 'not like', '%-split');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIsDocument(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->whereHas('transaction', function ($q) {
|
||||||
|
$q->whereNotNull('document_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeIsNotDocument(Builder $query): Builder
|
||||||
|
{
|
||||||
|
return $query->whereHas('transaction', function ($q) {
|
||||||
|
$q->whereNull('document_id');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ namespace App\Reports;
|
||||||
|
|
||||||
use App\Abstracts\Report;
|
use App\Abstracts\Report;
|
||||||
use App\Models\Banking\Transaction;
|
use App\Models\Banking\Transaction;
|
||||||
|
use App\Models\Banking\TransactionTax;
|
||||||
use App\Models\Document\Document;
|
use App\Models\Document\Document;
|
||||||
use App\Models\Setting\Tax;
|
use App\Models\Setting\Tax;
|
||||||
use App\Traits\Currencies;
|
use App\Traits\Currencies;
|
||||||
|
|
@ -68,6 +69,14 @@ class TaxSummary extends Report
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Incomes
|
||||||
|
$incomes = $this->applyFilters(Transaction::with('taxes')->income()->isNotDocument()->isNotTransfer(), ['date_field' => 'paid_at'])->get();
|
||||||
|
$this->setTotals($incomes, 'paid_at');
|
||||||
|
|
||||||
|
// Expenses
|
||||||
|
$expenses = $this->applyFilters(Transaction::with('taxes')->expense()->isNotDocument()->isNotTransfer(), ['date_field' => 'paid_at'])->get();
|
||||||
|
$this->setTotals($expenses, 'paid_at');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setTotals($items, $date_field, $check_type = false, $table = 'default', $with_tax = true)
|
public function setTotals($items, $date_field, $check_type = false, $table = 'default', $with_tax = true)
|
||||||
|
|
@ -78,6 +87,11 @@ class TaxSummary extends Report
|
||||||
|
|
||||||
$type = ($item->type === Document::INVOICE_TYPE || $item->type === 'income') ? 'income' : 'expense';
|
$type = ($item->type === Document::INVOICE_TYPE || $item->type === 'income') ? 'income' : 'expense';
|
||||||
|
|
||||||
|
if ($item instanceof Transaction && empty($item->document_id)) {
|
||||||
|
$this->setTransactionTaxTotal($item, $type, $date_field);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$date = $this->getFormattedDate(Date::parse($item->$date_field));
|
$date = $this->getFormattedDate(Date::parse($item->$date_field));
|
||||||
|
|
||||||
if ($date_field == 'paid_at') {
|
if ($date_field == 'paid_at') {
|
||||||
|
|
@ -122,6 +136,36 @@ class TaxSummary extends Report
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setTransactionTaxTotal($item, $type, $date_field)
|
||||||
|
{
|
||||||
|
if (empty($item->taxes)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$date = $this->getFormattedDate(Date::parse($item->$date_field));
|
||||||
|
|
||||||
|
foreach ($item->taxes as $tax) {
|
||||||
|
if (
|
||||||
|
!isset($this->row_values[$tax->name][$type][$date])
|
||||||
|
|| !isset($this->footer_totals[$tax->name][$date])
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$amount = $this->convertToDefault($tax->amount, $item->currency_code, $item->currency_rate);
|
||||||
|
|
||||||
|
if ($type == 'income') {
|
||||||
|
$this->row_values[$tax->name][$type][$date] += $amount;
|
||||||
|
|
||||||
|
$this->footer_totals[$tax->name][$date] += $amount;
|
||||||
|
} else {
|
||||||
|
$this->row_values[$tax->name][$type][$date] -= $amount;
|
||||||
|
|
||||||
|
$this->footer_totals[$tax->name][$date] -= $amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function getFields()
|
public function getFields()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue