mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Will update IBAN in existing account if necessary and/or possible.
This commit is contained in:
parent
38b88dce44
commit
e0577bddc5
@ -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']]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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),
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user