feat: updates

This commit is contained in:
JP
2024-08-15 20:11:21 +08:00
parent 52431a2c61
commit 3af7207ec3
61 changed files with 1674 additions and 480 deletions

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Actions\Ledgers;
use App\Actions\BaseAction;
use App\Commands\Ledgers\CreateLedgerCommand;
use App\DataObjects\CreateLedgerDTO;
use Closure;
use Spatie\LaravelData\Data;
class CreateLedgerAction extends BaseAction
{
public function __construct(
private readonly CreateLedgerCommand $createLedgerCommand,
) {}
public function __invoke(CreateLedgerDTO|Data $payload, Closure $next)
{
$this->createLedgerCommand->execute($payload->data);
return $next($payload);
}
}

View File

@@ -0,0 +1,91 @@
<?php
namespace App\Actions\Transactions;
use App\Actions\BaseAction;
use App\Actions\Ledgers\CreateLedgerAction;
use App\DataObjects\CreateLedgerDTO;
use App\DataObjects\CreateTransactionDTO;
use App\Models\Account;
use Closure;
use Illuminate\Support\Facades\Pipeline;
use Spatie\LaravelData\Data;
class CreateTransactionAction extends BaseAction
{
public function __invoke(CreateTransactionDTO|Data $payload, Closure $next)
{
$payload->transaction = $payload->transactionable->transactions()->create($payload->data);
$this->transactionAccountLedger($payload);
$this->withHoldingAccountLedger($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,
])->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,
transaction: $payload->transaction,
account: $withholdingAccount,
);
$this->ledgerPipe($ledgerPayload);
}
}