Will update IBAN in existing account if necessary and/or possible.

This commit is contained in:
James Cole 2023-02-18 06:37:05 +01:00
parent 38b88dce44
commit e0577bddc5
No known key found for this signature in database
GPG Key ID: B49A324B7EAD6D80
4 changed files with 66 additions and 13 deletions

View File

@ -29,9 +29,12 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Rules\UniqueIban;
use FireflyIII\Services\Internal\Update\AccountUpdateService;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Database\QueryException; use Illuminate\Database\QueryException;
use Log; use Log;
use Validator;
/** /**
* Class TransactionFactory * Class TransactionFactory
@ -43,6 +46,7 @@ class TransactionFactory
private ?TransactionCurrency $foreignCurrency; private ?TransactionCurrency $foreignCurrency;
private TransactionJournal $journal; private TransactionJournal $journal;
private bool $reconciled; private bool $reconciled;
private array $accountInformation;
/** /**
* Constructor. * Constructor.
@ -51,7 +55,8 @@ class TransactionFactory
*/ */
public function __construct() public function __construct()
{ {
$this->reconciled = false; $this->reconciled = false;
$this->accountInformation = [];
} }
/** /**
@ -129,6 +134,9 @@ class TransactionFactory
} }
$result->save(); $result->save();
// if present, update account with relevant account information from the array
$this->updateAccountInformation();
return $result; return $result;
} }
@ -212,4 +220,45 @@ class TransactionFactory
{ {
// empty function. // empty function.
} }
/**
* @param array $accountInformation
*/
public function setAccountInformation(array $accountInformation): void
{
$this->accountInformation = $accountInformation;
}
/**
* @return void
* @throws FireflyException
*/
private function updateAccountInformation(): void
{
if (!array_key_exists('iban', $this->accountInformation)) {
Log::debug('No IBAN information in array, will not update.');
return;
}
if ('' !== (string)$this->account->iban) {
Log::debug('Account already has IBAN information, will not update.');
return;
}
if ($this->account->iban === $this->accountInformation['iban']) {
Log::debug('Account already has this IBAN, will not update.');
return;
}
// validate info:
$validator = Validator::make(['iban' => $this->accountInformation['iban']], [
'iban' => ['required', new UniqueIban($this->account, $this->account->accountType->type)],
]);
if ($validator->fails()) {
Log::debug('Invalid or non-unique IBAN, will not update.');
return;
}
Log::debug('Will update account with IBAN information.');
$service = app(AccountUpdateService::class);
$service->update($this->account, ['iban' => $this->accountInformation['iban']]);
}
} }

View File

@ -244,6 +244,7 @@ class TransactionJournalFactory
$transactionFactory->setJournal($journal); $transactionFactory->setJournal($journal);
$transactionFactory->setAccount($sourceAccount); $transactionFactory->setAccount($sourceAccount);
$transactionFactory->setCurrency($currency); $transactionFactory->setCurrency($currency);
$transactionFactory->setAccountInformation($sourceInfo);
$transactionFactory->setForeignCurrency($foreignCurrency); $transactionFactory->setForeignCurrency($foreignCurrency);
$transactionFactory->setReconciled($row['reconciled'] ?? false); $transactionFactory->setReconciled($row['reconciled'] ?? false);
try { try {
@ -262,6 +263,7 @@ class TransactionJournalFactory
$transactionFactory->setUser($this->user); $transactionFactory->setUser($this->user);
$transactionFactory->setJournal($journal); $transactionFactory->setJournal($journal);
$transactionFactory->setAccount($destinationAccount); $transactionFactory->setAccount($destinationAccount);
$transactionFactory->setAccountInformation($destInfo);
$transactionFactory->setCurrency($currency); $transactionFactory->setCurrency($currency);
$transactionFactory->setForeignCurrency($foreignCurrency); $transactionFactory->setForeignCurrency($foreignCurrency);
$transactionFactory->setReconciled($row['reconciled'] ?? false); $transactionFactory->setReconciled($row['reconciled'] ?? false);
@ -451,7 +453,7 @@ class TransactionJournalFactory
*/ */
private function getCurrencyByAccount(string $type, ?TransactionCurrency $currency, Account $source, Account $destination): TransactionCurrency private function getCurrencyByAccount(string $type, ?TransactionCurrency $currency, Account $source, Account $destination): TransactionCurrency
{ {
Log::debug('Now ingetCurrencyByAccount()'); Log::debug('Now in getCurrencyByAccount()');
return match ($type) { return match ($type) {
default => $this->getCurrency($currency, $source), default => $this->getCurrency($currency, $source),

View File

@ -125,7 +125,7 @@ trait AccountServiceTrait
} }
} }
// the account role may not be set in the data but we may have it already: // the account role may not be set in the data, but we may have it already:
if (!array_key_exists('account_role', $data)) { if (!array_key_exists('account_role', $data)) {
$data['account_role'] = null; $data['account_role'] = null;
} }

View File

@ -54,7 +54,6 @@ trait JournalServiceTrait
* @param array $data * @param array $data
* *
* @return Account|null * @return Account|null
* @throws FireflyException * @throws FireflyException
*/ */
protected function getAccount(string $transactionType, string $direction, array $data): ?Account protected function getAccount(string $transactionType, string $direction, array $data): ?Account
@ -78,10 +77,11 @@ trait JournalServiceTrait
$result = $this->findAccountByNumber($result, $data, $expectedTypes[$transactionType]); $result = $this->findAccountByNumber($result, $data, $expectedTypes[$transactionType]);
$numberResult = $result; $numberResult = $result;
$result = $this->findAccountByName($result, $data, $expectedTypes[$transactionType]); $result = $this->findAccountByName($result, $data, $expectedTypes[$transactionType]);
$nameResult =$result;
// if result is NULL but IBAN is set, any result of the search by NAME can't overrule // if $result (find by name) is NULL, but IBAN is set, any result of the search by NAME can't overrule
// this account. In such a case, the name search must be retried with a new name. // this account. In such a case, the name search must be retried with a new name.
if (null !== $result && null === $numberResult && null === $ibanResult && '' !== (string) $data['iban']) { if (null !== $nameResult && null === $numberResult && null === $ibanResult && '' !== (string)$data['iban'] && '' !== (string) $nameResult->iban) {
$data['name'] = sprintf('%s (%s)', $data['name'], $data['iban']); $data['name'] = sprintf('%s (%s)', $data['name'], $data['iban']);
Log::debug(sprintf('Search again using the new name, "%s".', $data['name'])); Log::debug(sprintf('Search again using the new name, "%s".', $data['name']));
$result = $this->findAccountByName(null, $data, $expectedTypes[$transactionType]); $result = $this->findAccountByName(null, $data, $expectedTypes[$transactionType]);
@ -101,11 +101,15 @@ trait JournalServiceTrait
$result = $this->createAccount(null, $tempData, $expectedTypes[$transactionType][0]); $result = $this->createAccount(null, $tempData, $expectedTypes[$transactionType][0]);
} }
} }
if (null === $result) {
Log::debug('If nothing is found, create it.'); Log::debug('If nothing is found, create it.');
$result = $this->createAccount($result, $data, $expectedTypes[$transactionType][0]); $result = $this->createAccount($result, $data, $expectedTypes[$transactionType][0]);
Log::debug('If cant be created, return cash account.'); }
return $this->getCashAccount($result, $data, $expectedTypes[$transactionType]); if (null === $result) {
Log::debug('If cant be created, return cash account.');
$result = $this->getCashAccount($result, $data, $expectedTypes[$transactionType]);
}
return $result;
} }
/** /**
@ -329,7 +333,6 @@ trait JournalServiceTrait
* *
* @return string * @return string
* @throws FireflyException * @throws FireflyException
*/ */
protected function getAmount(string $amount): string protected function getAmount(string $amount): string
{ {
@ -348,7 +351,6 @@ trait JournalServiceTrait
* @param string|null $amount * @param string|null $amount
* *
* @return string|null * @return string|null
*/ */
protected function getForeignAmount(?string $amount): ?string protected function getForeignAmount(?string $amount): ?string
{ {