added transaction taxes in the tax report

This commit is contained in:
Cihan Şentürk 2025-04-28 20:26:36 +03:00 committed by GitHub
parent 0fceb96078
commit 635fee12ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 114 additions and 11 deletions

View File

@ -5,12 +5,13 @@ namespace App\Models\Banking;
use App\Abstracts\Model;
use App\Models\Banking\Transaction;
use App\Traits\Currencies;
use App\Traits\Transactions;
use Bkwld\Cloner\Cloneable;
use Illuminate\Database\Eloquent\Builder;
class TransactionTax extends Model
{
use Cloneable, Currencies;
use Cloneable, Currencies, Transactions;
protected $table = 'transaction_taxes';
@ -31,34 +32,92 @@ class TransactionTax extends Model
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)
{
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
{
return $query->where($this->qualifyColumn('type'), '=', Transaction::INCOME_RECURRING_TYPE)
->whereHas('document.recurring', function (Builder $query) {
$query->whereNull('deleted_at');
});
->whereHas('transaction.recurring', function (Builder $query) {
$query->whereNull('deleted_at');
});
}
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
{
return $query->where($this->qualifyColumn('type'), '=', Transaction::EXPENSE_RECURRING_TYPE)
->whereHas('document.recurring', function (Builder $query) {
$query->whereNull('deleted_at');
});
->whereHas('transaction.recurring', function (Builder $query) {
$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');
});
}
}

View File

@ -4,6 +4,7 @@ namespace App\Reports;
use App\Abstracts\Report;
use App\Models\Banking\Transaction;
use App\Models\Banking\TransactionTax;
use App\Models\Document\Document;
use App\Models\Setting\Tax;
use App\Traits\Currencies;
@ -68,6 +69,14 @@ class TaxSummary extends Report
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)
@ -78,6 +87,11 @@ class TaxSummary extends Report
$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));
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()
{
return [