transaction = $payload->transactionable->transactions()->create($payload->data); $this->transactionAccountLedger($payload); $this->withHoldingAccountLedger($payload); $this->cashAccountLedger($payload); return $next($payload); } public function transactionAccountLedger($payload): void { $branch = $payload->transaction->branch; if ($branch->isClientVatable) { //create transaction account ledger $ledgerPayload = new CreateLedgerDTO( branch_id: $payload->transactionable->branch_id, amount: $payload->transaction->net_amount ?? 0.00, transaction: $payload->transaction, account: $payload->transaction->account, ); $this->ledgerPipe($ledgerPayload); $this->inputTaxAccountLedger($payload); } else { //create transaction account ledger $ledgerPayload = new CreateLedgerDTO( branch_id: $payload->transactionable->branch_id, amount: $payload->transaction->gross_amount ?? 0.00, transaction: $payload->transaction, account: $payload->transaction->account, ); $this->ledgerPipe($ledgerPayload); } } public function ledgerPipe(CreateLedgerDTO $ledgerPayload): mixed { return Pipeline::send(passable: $ledgerPayload)->through([ CreateLedgerAction::class, CreateBalanceAction::class, ])->thenReturn(); } public function inputTaxAccountLedger($payload): void { $inputTax = Account::query()->where('account', 'Input Tax')->whereHas('balances', function ($balance) use ($payload) { return $balance->where('branch_id', $payload->transactionable->branch_id); })->first(); $ledgerPayload = new CreateLedgerDTO( branch_id: $payload->transactionable->branch_id, amount: $payload->transactionable->input_tax ?? 0.00, transaction: $payload->transaction, account: $inputTax, ); $this->ledgerPipe($ledgerPayload); } public function withHoldingAccountLedger($payload): void { $withholdingAccount = Account::query()->where('account', 'Payable Withholding Tax')->whereHas('balances', function ($balance) use ($payload) { return $balance->where('branch_id', $payload->transactionable->branch_id); })->first(); $ledgerPayload = new CreateLedgerDTO( branch_id: $payload->transactionable->branch_id, amount: $payload->transaction->payable_withholding_tax ?? 0.00, transaction: $payload->transaction, account: $withholdingAccount, ); $this->ledgerPipe($ledgerPayload); } public function cashAccountLedger($payload): void { $cashAccount = Account::query()->where('account', 'Cash')->whereHas('balances', function ($balance) use ($payload) { return $balance->where('branch_id', $payload->transactionable->branch_id); })->first(); $amount = $payload->transaction->gross_amount - $payload->transaction->creditable_withholding_tax; $ledgerPayload = new CreateLedgerDTO( branch_id: $payload->transactionable->branch_id, amount: $amount ?? 0.00, transaction: $payload->transaction, account: $cashAccount, ); $this->ledgerPipe($ledgerPayload); } }