akaunting/app/Jobs/Banking/SplitTransaction.php

77 lines
2.2 KiB
PHP
Raw Normal View History

2022-06-01 10:15:55 +03:00
<?php
namespace App\Jobs\Banking;
use App\Abstracts\Job;
use App\Interfaces\Job\ShouldUpdate;
use App\Models\Document\Document;
2023-03-21 10:59:05 +03:00
use App\Traits\Transactions;
use Illuminate\Support\Facades\DB;
2022-06-01 10:15:55 +03:00
use Illuminate\Support\Str;
class SplitTransaction extends Job implements ShouldUpdate
{
2023-03-21 10:59:05 +03:00
use Transactions;
2022-06-01 10:15:55 +03:00
public function handle(): array
{
$this->checkAmount();
2023-03-21 10:59:05 +03:00
DB::transaction(function () {
2022-06-01 10:15:55 +03:00
foreach ($this->request->items as $item) {
2023-03-21 10:59:05 +03:00
$transaction = $this->model->duplicate();
$transaction->number = $this->getNextTransactionNumber();
$transaction->split_id = $this->model->id;
$transaction->amount = $item['amount'];
2022-06-01 10:15:55 +03:00
$transaction->save();
$item['split'] = $transaction;
// Match only if document_id is given
if (empty($item['document_id'])) {
return;
}
$document = Document::find($item['document_id']);
if (empty($document)) {
return;
}
$this->dispatch(new MatchBankingDocumentTransaction($document, $transaction));
}
$this->model->type = config('type.transaction.' . $this->model->type . '.split_type');
$this->model->save();
});
return $this->request->items;
}
protected function checkAmount(): bool
{
$total_amount = 0;
foreach ($this->request->items as $item) {
$total_amount += $item['amount'];
}
2023-07-10 12:53:43 +03:00
$precision = config('money.currencies.' . $this->model->currency_code . '.precision');
2022-06-01 10:15:55 +03:00
$compare = bccomp($total_amount, $this->model->amount, $precision);
if ($compare !== 0) {
$error_amount = $this->model->amount;
2023-03-21 10:59:05 +03:00
$message = trans('messages.error.same_amount', [
'transaction' => ucfirst(trans_choice('general.' . Str::plural($this->model->type), 1)),
'amount' => money($error_amount, $this->model->currency_code)
2023-03-21 10:59:05 +03:00
]);
2022-06-01 10:15:55 +03:00
throw new \Exception($message);
}
return true;
}
}