From 635fee12ffb038cb7a129352afb13b79e7ec4bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cihan=20=C5=9Eent=C3=BCrk?= <53110792+CihanSenturk@users.noreply.github.com> Date: Mon, 28 Apr 2025 20:26:36 +0300 Subject: [PATCH] added transaction taxes in the tax report --- app/Models/Banking/TransactionTax.php | 81 +++++++++++++++++++++++---- app/Reports/TaxSummary.php | 44 +++++++++++++++ 2 files changed, 114 insertions(+), 11 deletions(-) diff --git a/app/Models/Banking/TransactionTax.php b/app/Models/Banking/TransactionTax.php index b50e3a89b..2b4ae76b6 100644 --- a/app/Models/Banking/TransactionTax.php +++ b/app/Models/Banking/TransactionTax.php @@ -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'); + }); } } diff --git a/app/Reports/TaxSummary.php b/app/Reports/TaxSummary.php index 62ee34b70..f75951223 100644 --- a/app/Reports/TaxSummary.php +++ b/app/Reports/TaxSummary.php @@ -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 [