From 1548e178bcdc26a0e741ddbf996cd85e853e9eb6 Mon Sep 17 00:00:00 2001 From: Jp Date: Mon, 9 Feb 2026 22:16:10 +0800 Subject: [PATCH] feat(client): add journals relation and improve transaction ledger handling - Add journals relation to Client model via Branch - Update branch selection in JournalsRelationManager to use code instead of name - Improve tax, withholding, and cash account ledger queries by adding client_id filter and amount checks - Add missing import for GenerateVoucher command in ExpensesRelationManager - Label 'Normal Balance' column in AccountsRelationManager --- .../Transactions/CreateTransactionAction.php | 40 ++++++++++++------- .../AccountsRelationManager.php | 2 +- .../ExpensesRelationManager.php | 1 + .../JournalsRelationManager.php | 2 +- app/Models/Client.php | 5 +++ 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/app/Actions/Transactions/CreateTransactionAction.php b/app/Actions/Transactions/CreateTransactionAction.php index d6e6564..a51ac32 100644 --- a/app/Actions/Transactions/CreateTransactionAction.php +++ b/app/Actions/Transactions/CreateTransactionAction.php @@ -71,15 +71,21 @@ class CreateTransactionAction extends BaseAction { $accountName = $isExpense ? 'Input Tax' : 'Output Tax'; $type = $isExpense ? 'debit' : 'credit'; + $clientId = $payload->transactionable->branch->client_id; - $taxAccount = Account::query()->where('account', $accountName)->whereHas('balances', function ($balance) use ($payload) { - return $balance->where('branch_id', $payload->transactionable->branch_id); - })->first(); + $taxAccount = Account::query() + ->where('account', $accountName) + ->where('client_id', $clientId) + ->first(); - if ($taxAccount) { + $amount = $isExpense + ? ($payload->transactionable->input_tax ?? 0.00) + : ($payload->transactionable->output_tax ?? 0.00); + + if ($taxAccount && $amount > 0) { $ledgerPayload = new CreateLedgerDTO( branch_id: $payload->transactionable->branch_id, - amount: $payload->transactionable->input_tax ?? 0.00, // Assuming input_tax holds the tax amount for both? Or output_tax? + amount: $amount, transaction: $payload->transaction, account: $taxAccount, type: $type, @@ -93,15 +99,19 @@ class CreateTransactionAction extends BaseAction $isExpense = $payload->transactionable instanceof \App\Models\Expense; $accountName = $isExpense ? 'Payable Withholding Tax' : 'Creditable Withholding Tax'; $type = $isExpense ? 'credit' : 'debit'; + $clientId = $payload->transactionable->branch->client_id; - $withholdingAccount = Account::query()->where('account', $accountName)->whereHas('balances', function ($balance) use ($payload) { - return $balance->where('branch_id', $payload->transactionable->branch_id); - })->first(); + $withholdingAccount = Account::query() + ->where('account', $accountName) + ->where('client_id', $clientId) + ->first(); - if ($withholdingAccount) { + $amount = $payload->transaction->payable_withholding_tax ?? 0.00; + + if ($withholdingAccount && $amount > 0) { $ledgerPayload = new CreateLedgerDTO( branch_id: $payload->transactionable->branch_id, - amount: $payload->transaction->payable_withholding_tax ?? 0.00, + amount: $amount, transaction: $payload->transaction, account: $withholdingAccount, type: $type, @@ -116,12 +126,14 @@ class CreateTransactionAction extends BaseAction $type = $isExpense ? 'credit' : 'debit'; $wht = $isExpense ? ($payload->transaction->payable_withholding_tax ?? 0) : ($payload->transaction->creditable_withholding_tax ?? 0); $amount = ($payload->transaction->gross_amount ?? 0) - $wht; + $clientId = $payload->transactionable->branch->client_id; - $cashAccount = Account::query()->where('account', 'Cash')->whereHas('balances', function ($balance) use ($payload) { - return $balance->where('branch_id', $payload->transactionable->branch_id); - })->first(); + $cashAccount = Account::query() + ->where('account', 'Cash') + ->where('client_id', $clientId) + ->first(); - if ($cashAccount) { + if ($cashAccount && $amount > 0) { $ledgerPayload = new CreateLedgerDTO( branch_id: $payload->transactionable->branch_id, amount: $amount, diff --git a/app/Filament/Resources/ClientResource/RelationManagers/AccountsRelationManager.php b/app/Filament/Resources/ClientResource/RelationManagers/AccountsRelationManager.php index f21a029..548121d 100644 --- a/app/Filament/Resources/ClientResource/RelationManagers/AccountsRelationManager.php +++ b/app/Filament/Resources/ClientResource/RelationManagers/AccountsRelationManager.php @@ -37,7 +37,7 @@ class AccountsRelationManager extends RelationManager ->columns([ Tables\Columns\TextColumn::make('account')->description(fn (Account $record): string => $record->description ?? ''), Tables\Columns\TextColumn::make('accountType.type'), - Tables\Columns\TextColumn::make('accountType.normal_balance'), + Tables\Columns\TextColumn::make('accountType.normal_balance')->label('Normal Balance'), ]) ->filters([ // diff --git a/app/Filament/Resources/ClientResource/RelationManagers/ExpensesRelationManager.php b/app/Filament/Resources/ClientResource/RelationManagers/ExpensesRelationManager.php index afc2b84..26f8a57 100644 --- a/app/Filament/Resources/ClientResource/RelationManagers/ExpensesRelationManager.php +++ b/app/Filament/Resources/ClientResource/RelationManagers/ExpensesRelationManager.php @@ -3,6 +3,7 @@ namespace App\Filament\Resources\ClientResource\RelationManagers; use App\Actions\Transactions\CreateTransactionAction; +use App\Commands\Expenses\GenerateVoucher; use App\DataObjects\CreateTransactionDTO; use App\Models\Account; use App\Models\Branch; diff --git a/app/Filament/Resources/ClientResource/RelationManagers/JournalsRelationManager.php b/app/Filament/Resources/ClientResource/RelationManagers/JournalsRelationManager.php index f7494eb..56e045f 100644 --- a/app/Filament/Resources/ClientResource/RelationManagers/JournalsRelationManager.php +++ b/app/Filament/Resources/ClientResource/RelationManagers/JournalsRelationManager.php @@ -35,7 +35,7 @@ class JournalsRelationManager extends RelationManager ->schema([ Select::make('branch_id') ->label('Branch') - ->options(fn () => Branch::where('client_id', $this->getOwnerRecord()->id)->pluck('name', 'id')) + ->options(fn () => Branch::where('client_id', $this->getOwnerRecord()->id)->pluck('code', 'id')) ->required() ->default(fn () => Branch::where('client_id', $this->getOwnerRecord()->id)->first()?->id), diff --git a/app/Models/Client.php b/app/Models/Client.php index b031183..2d25bb2 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -73,4 +73,9 @@ class Client extends Model { return $this->hasManyThrough(Expense::class, Branch::class); } + + public function journals(): HasManyThrough + { + return $this->hasManyThrough(Journal::class, Branch::class); + } }