mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-11-03 04:41:41 +00:00
Compare commits
10 Commits
develop-20
...
develop-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83a1e6616a | ||
|
|
66bd786842 | ||
|
|
33d73d8be8 | ||
|
|
75e190ba64 | ||
|
|
820569a52b | ||
|
|
05005eac32 | ||
|
|
5aa677c6fb | ||
|
|
456a3a9216 | ||
|
|
be25a7596f | ||
|
|
59a07e5dde |
@@ -35,7 +35,9 @@ use FireflyIII\Models\TransactionJournal;
|
|||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
||||||
|
use FireflyIII\Rules\UniqueIban;
|
||||||
use FireflyIII\Support\NullArrayObject;
|
use FireflyIII\Support\NullArrayObject;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trait JournalServiceTrait
|
* Trait JournalServiceTrait
|
||||||
@@ -53,7 +55,7 @@ trait JournalServiceTrait
|
|||||||
protected function getAccount(string $transactionType, string $direction, array $data): ?Account
|
protected function getAccount(string $transactionType, string $direction, array $data): ?Account
|
||||||
{
|
{
|
||||||
// some debug logging:
|
// some debug logging:
|
||||||
app('log')->debug(sprintf('Now in getAccount(%s)', $direction), $data);
|
Log::debug(sprintf('Now in getAccount(%s)', $direction), $data);
|
||||||
|
|
||||||
// expected type of source account, in order of preference
|
// expected type of source account, in order of preference
|
||||||
/** @var array $array */
|
/** @var array $array */
|
||||||
@@ -63,7 +65,7 @@ trait JournalServiceTrait
|
|||||||
|
|
||||||
// and now try to find it, based on the type of transaction.
|
// and now try to find it, based on the type of transaction.
|
||||||
$message = 'Transaction = %s, %s account should be in: %s. Direction is %s.';
|
$message = 'Transaction = %s, %s account should be in: %s. Direction is %s.';
|
||||||
app('log')->debug(sprintf($message, $transactionType, $direction, implode(', ', $expectedTypes[$transactionType] ?? ['UNKNOWN']), $direction));
|
Log::debug(sprintf($message, $transactionType, $direction, implode(', ', $expectedTypes[$transactionType] ?? ['UNKNOWN']), $direction));
|
||||||
|
|
||||||
$result = $this->findAccountById($data, $expectedTypes[$transactionType]);
|
$result = $this->findAccountById($data, $expectedTypes[$transactionType]);
|
||||||
$result = $this->findAccountByIban($result, $data, $expectedTypes[$transactionType]);
|
$result = $this->findAccountByIban($result, $data, $expectedTypes[$transactionType]);
|
||||||
@@ -77,7 +79,7 @@ trait JournalServiceTrait
|
|||||||
// 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 !== $nameResult && null === $numberResult && null === $ibanResult && '' !== (string) $data['iban'] && '' !== (string) $nameResult->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']);
|
||||||
app('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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +89,7 @@ trait JournalServiceTrait
|
|||||||
// if the result is NULL but the ID is set, an account could exist of the wrong type.
|
// if the result is NULL but the ID is set, an account could exist of the wrong type.
|
||||||
// that data can be used to create a new account of the right type.
|
// that data can be used to create a new account of the right type.
|
||||||
if (null === $result && null !== $data['id'] && null !== $creatableType) {
|
if (null === $result && null !== $data['id'] && null !== $creatableType) {
|
||||||
app('log')->debug(sprintf('Account #%d may exist and be of the wrong type, use data to create one of the right type.', $data['id']));
|
Log::debug(sprintf('Account #%d may exist and be of the wrong type, use data to create one of the right type.', $data['id']));
|
||||||
$temp = $this->findAccountById(['id' => $data['id']], []);
|
$temp = $this->findAccountById(['id' => $data['id']], []);
|
||||||
if (null !== $temp) {
|
if (null !== $temp) {
|
||||||
$tempData = [
|
$tempData = [
|
||||||
@@ -100,11 +102,11 @@ trait JournalServiceTrait
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (null === $result && null !== $creatableType) {
|
if (null === $result && null !== $creatableType) {
|
||||||
app('log')->debug('If nothing is found, create it.');
|
Log::debug('If nothing is found, create it.');
|
||||||
$result = $this->createAccount($result, $data, $creatableType);
|
$result = $this->createAccount($result, $data, $creatableType);
|
||||||
}
|
}
|
||||||
if (null === $result) {
|
if (null === $result) {
|
||||||
app('log')->debug('If cant be created, return cash account.');
|
Log::debug('If cant be created, return cash account.');
|
||||||
$result = $this->getCashAccount($result, $data, $expectedTypes[$transactionType]);
|
$result = $this->getCashAccount($result, $data, $expectedTypes[$transactionType]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,21 +119,21 @@ trait JournalServiceTrait
|
|||||||
if (null !== $data['id']) {
|
if (null !== $data['id']) {
|
||||||
$search = $this->accountRepository->find((int) $data['id']);
|
$search = $this->accountRepository->find((int) $data['id']);
|
||||||
if (null !== $search && in_array($search->accountType->type, $types, true)) {
|
if (null !== $search && in_array($search->accountType->type, $types, true)) {
|
||||||
app('log')->debug(
|
Log::debug(
|
||||||
sprintf('Found "account_id" object: #%d, "%s" of type %s (1)', $search->id, $search->name, $search->accountType->type)
|
sprintf('Found "account_id" object: #%d, "%s" of type %s (1)', $search->id, $search->name, $search->accountType->type)
|
||||||
);
|
);
|
||||||
|
|
||||||
return $search;
|
return $search;
|
||||||
}
|
}
|
||||||
if (null !== $search && 0 === count($types)) {
|
if (null !== $search && 0 === count($types)) {
|
||||||
app('log')->debug(
|
Log::debug(
|
||||||
sprintf('Found "account_id" object: #%d, "%s" of type %s (2)', $search->id, $search->name, $search->accountType->type)
|
sprintf('Found "account_id" object: #%d, "%s" of type %s (2)', $search->id, $search->name, $search->accountType->type)
|
||||||
);
|
);
|
||||||
|
|
||||||
return $search;
|
return $search;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('Found no account by ID #%d of types', $data['id']), $types);
|
Log::debug(sprintf('Found no account by ID #%d of types', $data['id']), $types);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -139,12 +141,12 @@ trait JournalServiceTrait
|
|||||||
private function findAccountByIban(?Account $account, array $data, array $types): ?Account
|
private function findAccountByIban(?Account $account, array $data, array $types): ?Account
|
||||||
{
|
{
|
||||||
if (null !== $account) {
|
if (null !== $account) {
|
||||||
app('log')->debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name));
|
Log::debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name));
|
||||||
|
|
||||||
return $account;
|
return $account;
|
||||||
}
|
}
|
||||||
if (null === $data['iban'] || '' === $data['iban']) {
|
if (null === $data['iban'] || '' === $data['iban']) {
|
||||||
app('log')->debug('IBAN is empty, will not search for IBAN.');
|
Log::debug('IBAN is empty, will not search for IBAN.');
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -154,11 +156,11 @@ trait JournalServiceTrait
|
|||||||
$source ??= $this->accountRepository->findByIbanNull($data['iban'], $types);
|
$source ??= $this->accountRepository->findByIbanNull($data['iban'], $types);
|
||||||
|
|
||||||
if (null !== $source) {
|
if (null !== $source) {
|
||||||
app('log')->debug(sprintf('Found "account_iban" object: #%d, %s', $source->id, $source->name));
|
Log::debug(sprintf('Found "account_iban" object: #%d, %s', $source->id, $source->name));
|
||||||
|
|
||||||
return $source;
|
return $source;
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('Found no account with IBAN "%s" of expected types', $data['iban']), $types);
|
Log::debug(sprintf('Found no account with IBAN "%s" of expected types', $data['iban']), $types);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -166,12 +168,12 @@ trait JournalServiceTrait
|
|||||||
private function findAccountByNumber(?Account $account, array $data, array $types): ?Account
|
private function findAccountByNumber(?Account $account, array $data, array $types): ?Account
|
||||||
{
|
{
|
||||||
if (null !== $account) {
|
if (null !== $account) {
|
||||||
app('log')->debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name));
|
Log::debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name));
|
||||||
|
|
||||||
return $account;
|
return $account;
|
||||||
}
|
}
|
||||||
if (null === $data['number'] || '' === $data['number']) {
|
if (null === $data['number'] || '' === $data['number']) {
|
||||||
app('log')->debug('Account number is empty, will not search for account number.');
|
Log::debug('Account number is empty, will not search for account number.');
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -182,12 +184,12 @@ trait JournalServiceTrait
|
|||||||
$source ??= $this->accountRepository->findByAccountNumber((string) $data['number'], $types);
|
$source ??= $this->accountRepository->findByAccountNumber((string) $data['number'], $types);
|
||||||
|
|
||||||
if (null !== $source) {
|
if (null !== $source) {
|
||||||
app('log')->debug(sprintf('Found account: #%d, %s', $source->id, $source->name));
|
Log::debug(sprintf('Found account: #%d, %s', $source->id, $source->name));
|
||||||
|
|
||||||
return $source;
|
return $source;
|
||||||
}
|
}
|
||||||
|
|
||||||
app('log')->debug(sprintf('Found no account with account number "%s" of expected types', $data['number']), $types);
|
Log::debug(sprintf('Found no account with account number "%s" of expected types', $data['number']), $types);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -195,12 +197,12 @@ trait JournalServiceTrait
|
|||||||
private function findAccountByName(?Account $account, array $data, array $types): ?Account
|
private function findAccountByName(?Account $account, array $data, array $types): ?Account
|
||||||
{
|
{
|
||||||
if (null !== $account) {
|
if (null !== $account) {
|
||||||
app('log')->debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name));
|
Log::debug(sprintf('Already have account #%d ("%s"), return that.', $account->id, $account->name));
|
||||||
|
|
||||||
return $account;
|
return $account;
|
||||||
}
|
}
|
||||||
if (null === $data['name'] || '' === $data['name']) {
|
if (null === $data['name'] || '' === $data['name']) {
|
||||||
app('log')->debug('Account name is empty, will not search for account name.');
|
Log::debug('Account name is empty, will not search for account name.');
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -212,11 +214,11 @@ trait JournalServiceTrait
|
|||||||
$source ??= $this->accountRepository->findByName($data['name'], $types);
|
$source ??= $this->accountRepository->findByName($data['name'], $types);
|
||||||
|
|
||||||
if (null !== $source) {
|
if (null !== $source) {
|
||||||
app('log')->debug(sprintf('Found "account_name" object: #%d, %s', $source->id, $source->name));
|
Log::debug(sprintf('Found "account_name" object: #%d, %s', $source->id, $source->name));
|
||||||
|
|
||||||
return $source;
|
return $source;
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('Found no account with account name "%s" of expected types', $data['name']), $types);
|
Log::debug(sprintf('Found no account with account name "%s" of expected types', $data['name']), $types);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -243,10 +245,10 @@ trait JournalServiceTrait
|
|||||||
*/
|
*/
|
||||||
private function createAccount(?Account $account, array $data, string $preferredType): ?Account
|
private function createAccount(?Account $account, array $data, string $preferredType): ?Account
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in createAccount()', $data);
|
Log::debug('Now in createAccount()', $data);
|
||||||
// return new account.
|
// return new account.
|
||||||
if (null !== $account) {
|
if (null !== $account) {
|
||||||
app('log')->debug(
|
Log::debug(
|
||||||
sprintf(
|
sprintf(
|
||||||
'Was given %s account #%d ("%s") so will simply return that.',
|
'Was given %s account #%d ("%s") so will simply return that.',
|
||||||
$account->accountType->type,
|
$account->accountType->type,
|
||||||
@@ -262,23 +264,32 @@ trait JournalServiceTrait
|
|||||||
}
|
}
|
||||||
// fix name of account if only IBAN is given:
|
// fix name of account if only IBAN is given:
|
||||||
if ('' === (string) $data['name'] && '' !== (string) $data['iban']) {
|
if ('' === (string) $data['name'] && '' !== (string) $data['iban']) {
|
||||||
app('log')->debug(sprintf('Account name is now IBAN ("%s")', $data['iban']));
|
Log::debug(sprintf('Account name is now IBAN ("%s")', $data['iban']));
|
||||||
$data['name'] = $data['iban'];
|
$data['name'] = $data['iban'];
|
||||||
}
|
}
|
||||||
// fix name of account if only number is given:
|
// fix name of account if only number is given:
|
||||||
if ('' === (string) $data['name'] && '' !== (string) $data['number']) {
|
if ('' === (string) $data['name'] && '' !== (string) $data['number']) {
|
||||||
app('log')->debug(sprintf('Account name is now account number ("%s")', $data['number']));
|
Log::debug(sprintf('Account name is now account number ("%s")', $data['number']));
|
||||||
$data['name'] = $data['number'];
|
$data['name'] = $data['number'];
|
||||||
}
|
}
|
||||||
// if name is still NULL, return NULL.
|
// if name is still NULL, return NULL.
|
||||||
if ('' === (string) $data['name']) {
|
if ('' === (string) $data['name']) {
|
||||||
app('log')->debug('Account name is still NULL, return NULL.');
|
Log::debug('Account name is still NULL, return NULL.');
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
// 2025-04-19 sanity check on IBAN.
|
||||||
|
$validator = new UniqueIban(null, $preferredType);
|
||||||
|
if ('' !== (string) $data['iban'] && !$validator->passes('iban', $data['iban'])) {
|
||||||
|
Log::warning(sprintf('IBAN "%s" is already in use, quietly ignore it.', $data['iban']));
|
||||||
|
$data['iban'] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// $data['name'] = $data['name'] ?? '(no name)';
|
// $data['name'] = $data['name'] ?? '(no name)';
|
||||||
|
|
||||||
$account = $this->accountRepository->store(
|
$account = $this->accountRepository->store(
|
||||||
[
|
[
|
||||||
'account_type_id' => null,
|
'account_type_id' => null,
|
||||||
'account_type_name' => $preferredType,
|
'account_type_name' => $preferredType,
|
||||||
@@ -314,7 +325,7 @@ trait JournalServiceTrait
|
|||||||
&& in_array(AccountTypeEnum::CASH->value, $types, true)) {
|
&& in_array(AccountTypeEnum::CASH->value, $types, true)) {
|
||||||
$account = $this->accountRepository->getCashAccount();
|
$account = $this->accountRepository->getCashAccount();
|
||||||
}
|
}
|
||||||
app('log')->debug('Cannot return cash account, return input instead.');
|
Log::debug('Cannot return cash account, return input instead.');
|
||||||
|
|
||||||
return $account;
|
return $account;
|
||||||
}
|
}
|
||||||
@@ -327,7 +338,7 @@ trait JournalServiceTrait
|
|||||||
if ('' === $amount) {
|
if ('' === $amount) {
|
||||||
throw new FireflyException(sprintf('The amount cannot be an empty string: "%s"', $amount));
|
throw new FireflyException(sprintf('The amount cannot be an empty string: "%s"', $amount));
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('Now in getAmount("%s")', $amount));
|
Log::debug(sprintf('Now in getAmount("%s")', $amount));
|
||||||
if (0 === bccomp('0', $amount)) {
|
if (0 === bccomp('0', $amount)) {
|
||||||
throw new FireflyException(sprintf('The amount seems to be zero: "%s"', $amount));
|
throw new FireflyException(sprintf('The amount seems to be zero: "%s"', $amount));
|
||||||
}
|
}
|
||||||
@@ -338,21 +349,21 @@ trait JournalServiceTrait
|
|||||||
protected function getForeignAmount(?string $amount): ?string
|
protected function getForeignAmount(?string $amount): ?string
|
||||||
{
|
{
|
||||||
if (null === $amount) {
|
if (null === $amount) {
|
||||||
app('log')->debug('No foreign amount info in array. Return NULL');
|
Log::debug('No foreign amount info in array. Return NULL');
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if ('' === $amount) {
|
if ('' === $amount) {
|
||||||
app('log')->debug('Foreign amount is empty string, return NULL.');
|
Log::debug('Foreign amount is empty string, return NULL.');
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (0 === bccomp('0', $amount)) {
|
if (0 === bccomp('0', $amount)) {
|
||||||
app('log')->debug('Foreign amount is 0.0, return NULL.');
|
Log::debug('Foreign amount is 0.0, return NULL.');
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
app('log')->debug(sprintf('Foreign amount is %s', $amount));
|
Log::debug(sprintf('Foreign amount is %s', $amount));
|
||||||
|
|
||||||
return $amount;
|
return $amount;
|
||||||
}
|
}
|
||||||
@@ -366,7 +377,7 @@ trait JournalServiceTrait
|
|||||||
}
|
}
|
||||||
$budget = $this->budgetRepository->findBudget($data['budget_id'], $data['budget_name']);
|
$budget = $this->budgetRepository->findBudget($data['budget_id'], $data['budget_name']);
|
||||||
if (null !== $budget) {
|
if (null !== $budget) {
|
||||||
app('log')->debug(sprintf('Link budget #%d to journal #%d', $budget->id, $journal->id));
|
Log::debug(sprintf('Link budget #%d to journal #%d', $budget->id, $journal->id));
|
||||||
$journal->budgets()->sync([$budget->id]);
|
$journal->budgets()->sync([$budget->id]);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -379,7 +390,7 @@ trait JournalServiceTrait
|
|||||||
{
|
{
|
||||||
$category = $this->categoryRepository->findCategory($data['category_id'], $data['category_name']);
|
$category = $this->categoryRepository->findCategory($data['category_id'], $data['category_name']);
|
||||||
if (null !== $category) {
|
if (null !== $category) {
|
||||||
app('log')->debug(sprintf('Link category #%d to journal #%d', $category->id, $journal->id));
|
Log::debug(sprintf('Link category #%d to journal #%d', $category->id, $journal->id));
|
||||||
$journal->categories()->sync([$category->id]);
|
$journal->categories()->sync([$category->id]);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -399,7 +410,7 @@ trait JournalServiceTrait
|
|||||||
}
|
}
|
||||||
$note->text = $notes;
|
$note->text = $notes;
|
||||||
$note->save();
|
$note->save();
|
||||||
app('log')->debug(sprintf('Stored notes for journal #%d', $journal->id));
|
Log::debug(sprintf('Stored notes for journal #%d', $journal->id));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -412,18 +423,18 @@ trait JournalServiceTrait
|
|||||||
*/
|
*/
|
||||||
protected function storeTags(TransactionJournal $journal, ?array $tags): void
|
protected function storeTags(TransactionJournal $journal, ?array $tags): void
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in storeTags()', $tags ?? []);
|
Log::debug('Now in storeTags()', $tags ?? []);
|
||||||
$this->tagFactory->setUser($journal->user);
|
$this->tagFactory->setUser($journal->user);
|
||||||
$set = [];
|
$set = [];
|
||||||
if (!is_array($tags)) {
|
if (!is_array($tags)) {
|
||||||
app('log')->debug('Tags is not an array, break.');
|
Log::debug('Tags is not an array, break.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app('log')->debug('Start of loop.');
|
Log::debug('Start of loop.');
|
||||||
foreach ($tags as $string) {
|
foreach ($tags as $string) {
|
||||||
$string = (string) $string;
|
$string = (string) $string;
|
||||||
app('log')->debug(sprintf('Now at tag "%s"', $string));
|
Log::debug(sprintf('Now at tag "%s"', $string));
|
||||||
if ('' !== $string) {
|
if ('' !== $string) {
|
||||||
$tag = $this->tagFactory->findOrCreate($string);
|
$tag = $this->tagFactory->findOrCreate($string);
|
||||||
if (null !== $tag) {
|
if (null !== $tag) {
|
||||||
@@ -432,8 +443,8 @@ trait JournalServiceTrait
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$set = array_unique($set);
|
$set = array_unique($set);
|
||||||
app('log')->debug('End of loop.');
|
Log::debug('End of loop.');
|
||||||
app('log')->debug(sprintf('Total nr. of tags: %d', count($tags)), $tags);
|
Log::debug(sprintf('Total nr. of tags: %d', count($tags)), $tags);
|
||||||
$journal->tags()->sync($set);
|
$journal->tags()->sync($set);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ class AccountValidator
|
|||||||
*/
|
*/
|
||||||
protected function findExistingAccount(array $validTypes, array $data, bool $inverse = false): ?Account
|
protected function findExistingAccount(array $validTypes, array $data, bool $inverse = false): ?Account
|
||||||
{
|
{
|
||||||
app('log')->debug('Now in findExistingAccount', $data);
|
app('log')->debug('Now in findExistingAccount', [$validTypes, $data]);
|
||||||
app('log')->debug('The search will be reversed!');
|
app('log')->debug('The search will be reversed!');
|
||||||
$accountId = array_key_exists('id', $data) ? $data['id'] : null;
|
$accountId = array_key_exists('id', $data) ? $data['id'] : null;
|
||||||
$accountIban = array_key_exists('iban', $data) ? $data['iban'] : null;
|
$accountIban = array_key_exists('iban', $data) ? $data['iban'] : null;
|
||||||
|
|||||||
23
changelog.md
23
changelog.md
@@ -3,6 +3,29 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## 6.2.11 - 2025-04-21
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support for Persian (`fa_IR`)
|
||||||
|
- Add expiry details for personal access tokens
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- [PR 10039](https://github.com/firefly-iii/firefly-iii/pull/10039) (update check: consider cron succesfull when disabled or too frequent) reported by @ovv
|
||||||
|
- Update currency list and update exchange rates
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- [Issue 9398](https://github.com/firefly-iii/firefly-iii/issues/9398) (Expand email settings to allow self-signed certificates) reported by @SoulSeekkor
|
||||||
|
- [Issue 9858](https://github.com/firefly-iii/firefly-iii/issues/9858) (Homepage "left to spend" count two times an expense with "foreign amount") reported by @M4xS0ch
|
||||||
|
- [Issue 10015](https://github.com/firefly-iii/firefly-iii/issues/10015) ("It looks like this IBAN is already in use." when editing asset account.) reported by @wolph
|
||||||
|
- [Issue 10025](https://github.com/firefly-iii/firefly-iii/issues/10025) (Liabilities not counted in income and expenses) reported by @BhasherBEL
|
||||||
|
- [Issue 10068](https://github.com/firefly-iii/firefly-iii/issues/10068) (Export Data isn't exporting all transactions in the data) reported by @firsttiger
|
||||||
|
- [Issue 10069](https://github.com/firefly-iii/firefly-iii/issues/10069) (Undefined array key "foreign_currency_decimal_places") reported by @akong-carbon6
|
||||||
|
- [Issue 10114](https://github.com/firefly-iii/firefly-iii/issues/10114) (Budget for foreign currency not getting updated when a transaction refers to it) reported by @srikakulamts
|
||||||
|
- [Issue 10150](https://github.com/firefly-iii/firefly-iii/issues/10150) (Mass deletion of initial balance throws 404 and doesn't delete) reported by @Tyler-Angell
|
||||||
|
|
||||||
## 6.2.10 - 2025-03-22
|
## 6.2.10 - 2025-03-22
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ return [
|
|||||||
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
'running_balance_column' => env('USE_RUNNING_BALANCE', false),
|
||||||
// see cer.php for exchange rates feature flag.
|
// see cer.php for exchange rates feature flag.
|
||||||
],
|
],
|
||||||
'version' => 'develop/2025-04-19',
|
'version' => 'develop/2025-04-20',
|
||||||
'api_version' => '2.1.0', // field is no longer used.
|
'api_version' => '2.1.0', // field is no longer used.
|
||||||
'db_version' => 25,
|
'db_version' => 25,
|
||||||
|
|
||||||
|
|||||||
26
package-lock.json
generated
26
package-lock.json
generated
@@ -4420,9 +4420,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001714",
|
"version": "1.0.30001715",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz",
|
||||||
"integrity": "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==",
|
"integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -11015,13 +11015,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tinyglobby": {
|
"node_modules/tinyglobby": {
|
||||||
"version": "0.2.12",
|
"version": "0.2.13",
|
||||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
|
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
|
||||||
"integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
|
"integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fdir": "^6.4.3",
|
"fdir": "^6.4.4",
|
||||||
"picomatch": "^4.0.2"
|
"picomatch": "^4.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -11032,9 +11032,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tinyglobby/node_modules/fdir": {
|
"node_modules/tinyglobby/node_modules/fdir": {
|
||||||
"version": "6.4.3",
|
"version": "6.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
|
||||||
"integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
|
"integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
@@ -11442,9 +11442,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/vite/node_modules/fdir": {
|
"node_modules/vite/node_modules/fdir": {
|
||||||
"version": "6.4.3",
|
"version": "6.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
|
||||||
"integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
|
"integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"firefly": {
|
"firefly": {
|
||||||
"administrations_page_title": "Finanzverwaltungen",
|
"administrations_page_title": "Finanzverwaltungen",
|
||||||
"administrations_index_menu": "Finanzverwaltung",
|
"administrations_index_menu": "Finanzverwaltung",
|
||||||
"expires_at": "Expires at",
|
"expires_at": "G\u00fcltig bis",
|
||||||
"temp_administrations_introduction": "Firefly III wird bald die M\u00f6glichkeit erhalten, mehrere Finanzverwaltungen zu verwalten. Im Moment verf\u00fcgen Sie nur \u00fcber eine. Sie k\u00f6nnen den Titel dieser Verwaltung und ihre eigene W\u00e4hrung festlegen. Dies ersetzt die bisherige Einstellung, bei der Sie Ihre \u201eStandardw\u00e4hrung\u201c festlegen konnten. Diese Einstellung ist jetzt an die Finanzverwaltung gebunden und kann f\u00fcr jede Verwaltung unterschiedlich sein.",
|
"temp_administrations_introduction": "Firefly III wird bald die M\u00f6glichkeit erhalten, mehrere Finanzverwaltungen zu verwalten. Im Moment verf\u00fcgen Sie nur \u00fcber eine. Sie k\u00f6nnen den Titel dieser Verwaltung und ihre eigene W\u00e4hrung festlegen. Dies ersetzt die bisherige Einstellung, bei der Sie Ihre \u201eStandardw\u00e4hrung\u201c festlegen konnten. Diese Einstellung ist jetzt an die Finanzverwaltung gebunden und kann f\u00fcr jede Verwaltung unterschiedlich sein.",
|
||||||
"administration_currency_form_help": "Es kann l\u00e4nger dauern, bis die Seite geladen ist, wenn Sie die Landesw\u00e4hrung \u00e4ndern, da die Buchungen m\u00f6glicherweise in Ihre (neue) Landesw\u00e4hrung umgerechnet werden m\u00fcssen.",
|
"administration_currency_form_help": "Es kann l\u00e4nger dauern, bis die Seite geladen ist, wenn Sie die Landesw\u00e4hrung \u00e4ndern, da die Buchungen m\u00f6glicherweise in Ihre (neue) Landesw\u00e4hrung umgerechnet werden m\u00fcssen.",
|
||||||
"administrations_page_edit_sub_title_js": "Finanzverwaltung \u201e{title}\u201c bearbeiten",
|
"administrations_page_edit_sub_title_js": "Finanzverwaltung \u201e{title}\u201c bearbeiten",
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"firefly": {
|
"firefly": {
|
||||||
"administrations_page_title": "Financial administrations",
|
"administrations_page_title": "Administra\u00e7\u00e3o financeira",
|
||||||
"administrations_index_menu": "Financial administrations",
|
"administrations_index_menu": "Administra\u00e7\u00e3o financeira",
|
||||||
"expires_at": "Expires at",
|
"expires_at": "Expira em",
|
||||||
"temp_administrations_introduction": "Firefly III will soon get the ability to manage multiple financial administrations. Right now, you only have the one. You can set the title of this administration and its native currency. This replaces the previous setting where you would set your \"default currency\". This setting is now tied to the financial administration and can be different per administration.",
|
"temp_administrations_introduction": "O Firefly III ter\u00e1 em breve a capacidade de gerir m\u00faltiplas administra\u00e7\u00f5es financeiras. Neste momento, voc\u00ea tem apenas um. Voc\u00ea pode definir o t\u00edtulo desta administra\u00e7\u00e3o e sua moeda nativa. Isso substitui a configura\u00e7\u00e3o anterior onde voc\u00ea definiria sua \"moeda padr\u00e3o\". Esta defini\u00e7\u00e3o est\u00e1 agora ligada \u00e0 administra\u00e7\u00e3o financeira e pode ser diferente por administra\u00e7\u00e3o.",
|
||||||
"administration_currency_form_help": "It may take a long time for the page to load if you change the native currency because transaction may need to be converted to your (new) native currency.",
|
"administration_currency_form_help": "A p\u00e1gina poder\u00e1 levar muito tempo para ser carregada, se voc\u00ea alterar a moeda nativa, porque a transa\u00e7\u00e3o precisar\u00e1 ser convertida para a sua (nova) moeda nativa.",
|
||||||
"administrations_page_edit_sub_title_js": "Edit financial administration \"{title}\"",
|
"administrations_page_edit_sub_title_js": "Editar administra\u00e7\u00e3o financeira \"{title}\"",
|
||||||
"table": "Tabela",
|
"table": "Tabela",
|
||||||
"welcome_back": "O que est\u00e1 acontecendo?",
|
"welcome_back": "O que est\u00e1 acontecendo?",
|
||||||
"flash_error": "Erro!",
|
"flash_error": "Erro!",
|
||||||
@@ -16,11 +16,11 @@
|
|||||||
"select_source_account": "Por favor, selecione ou digite um nome de conta de origem v\u00e1lido",
|
"select_source_account": "Por favor, selecione ou digite um nome de conta de origem v\u00e1lido",
|
||||||
"split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida",
|
"split_transaction_title": "Descri\u00e7\u00e3o da transa\u00e7\u00e3o dividida",
|
||||||
"errors_submission": "Algo deu errado com seu envio. Por favor, verifique os erros abaixo.",
|
"errors_submission": "Algo deu errado com seu envio. Por favor, verifique os erros abaixo.",
|
||||||
"is_reconciled": "Is reconciled",
|
"is_reconciled": "Est\u00e1 reconciliado",
|
||||||
"split": "Dividir",
|
"split": "Dividir",
|
||||||
"single_split": "Divis\u00e3o",
|
"single_split": "Divis\u00e3o",
|
||||||
"not_enough_currencies": "Not enough currencies",
|
"not_enough_currencies": "Moedas insuficientes",
|
||||||
"not_enough_currencies_enabled": "If you have just one currency enabled, there is no need to add exchange rates.",
|
"not_enough_currencies_enabled": "Se voc\u00ea tem apenas uma moeda ativada, n\u00e3o h\u00e1 necessidade de adicionar taxas de c\u00e2mbio.",
|
||||||
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi salva.",
|
"transaction_stored_link": "<a href=\"transactions\/show\/{ID}\">Transa\u00e7\u00e3o #{ID} (\"{title}\")<\/a> foi salva.",
|
||||||
"webhook_stored_link": "<a href=\"transactions\/show\/{ID}\">Webhooh #{ID} (\"{title}\")<\/a> foi salva.",
|
"webhook_stored_link": "<a href=\"transactions\/show\/{ID}\">Webhooh #{ID} (\"{title}\")<\/a> foi salva.",
|
||||||
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") foi atualizado.",
|
"webhook_updated_link": "<a href=\"webhooks\/show\/{ID}\">Webhook #{ID}<\/a> (\"{title}\") foi atualizado.",
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
"apply_rules_checkbox": "Aplicar regras",
|
"apply_rules_checkbox": "Aplicar regras",
|
||||||
"fire_webhooks_checkbox": "Acionar webhooks",
|
"fire_webhooks_checkbox": "Acionar webhooks",
|
||||||
"no_budget_pointer": "Parece que voc\u00ea ainda n\u00e3o tem or\u00e7amentos. Voc\u00ea deve criar alguns na p\u00e1gina de <a href=\"budgets\">or\u00e7amentos<\/a>. Or\u00e7amentos podem ajud\u00e1-lo a manter o controle das despesas.",
|
"no_budget_pointer": "Parece que voc\u00ea ainda n\u00e3o tem or\u00e7amentos. Voc\u00ea deve criar alguns na p\u00e1gina de <a href=\"budgets\">or\u00e7amentos<\/a>. Or\u00e7amentos podem ajud\u00e1-lo a manter o controle das despesas.",
|
||||||
"no_bill_pointer": "You seem to have no subscription yet. You should create some on the <a href=\"subscriptions\">subscription<\/a>-page. Subscriptions can help you keep track of expenses.",
|
"no_bill_pointer": "Parece que voc\u00ea n\u00e3o tem assinatura ainda. Voc\u00ea deve criar alguma na p\u00e1gina de <a href=\"subscriptions\">assinaturas<\/a>. Assinaturas podem ajud\u00e1-lo a manter o controle das despesas.",
|
||||||
"source_account": "Conta origem",
|
"source_account": "Conta origem",
|
||||||
"hidden_fields_preferences": "Voc\u00ea pode habilitar mais op\u00e7\u00f5es de transa\u00e7\u00e3o em suas <a href=\"preferences\">prefer\u00eancias<\/a>.",
|
"hidden_fields_preferences": "Voc\u00ea pode habilitar mais op\u00e7\u00f5es de transa\u00e7\u00e3o em suas <a href=\"preferences\">prefer\u00eancias<\/a>.",
|
||||||
"destination_account": "Conta destino",
|
"destination_account": "Conta destino",
|
||||||
@@ -43,10 +43,10 @@
|
|||||||
"submit": "Enviar",
|
"submit": "Enviar",
|
||||||
"amount": "Valor",
|
"amount": "Valor",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"is_reconciled_fields_dropped": "Because this transaction is reconciled, you will not be able to update the accounts, nor the amount(s) unless you remove the reconciliation flag.",
|
"is_reconciled_fields_dropped": "Como a transa\u00e7\u00e3o est\u00e1 reconciliada, voc\u00ea n\u00e3o pode atualizar as contas, nem o(s) valor(es) at\u00e9 voc\u00ea remover o indicador de reconcilia\u00e7\u00e3o.",
|
||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
"no_budget": "(sem or\u00e7amento)",
|
"no_budget": "(sem or\u00e7amento)",
|
||||||
"no_bill": "(no subscription)",
|
"no_bill": "(sem assinatura)",
|
||||||
"category": "Categoria",
|
"category": "Categoria",
|
||||||
"attachments": "Anexos",
|
"attachments": "Anexos",
|
||||||
"notes": "Notas",
|
"notes": "Notas",
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
"destination_account_reconciliation": "Voc\u00ea n\u00e3o pode editar a conta destino de uma transa\u00e7\u00e3o de reconcilia\u00e7\u00e3o.",
|
"destination_account_reconciliation": "Voc\u00ea n\u00e3o pode editar a conta destino de uma transa\u00e7\u00e3o de reconcilia\u00e7\u00e3o.",
|
||||||
"source_account_reconciliation": "Voc\u00ea n\u00e3o pode editar a conta de origem de uma transa\u00e7\u00e3o de reconcilia\u00e7\u00e3o.",
|
"source_account_reconciliation": "Voc\u00ea n\u00e3o pode editar a conta de origem de uma transa\u00e7\u00e3o de reconcilia\u00e7\u00e3o.",
|
||||||
"budget": "Or\u00e7amento",
|
"budget": "Or\u00e7amento",
|
||||||
"bill": "Subscription",
|
"bill": "Assinatura",
|
||||||
"you_create_withdrawal": "Voc\u00ea est\u00e1 criando uma sa\u00edda.",
|
"you_create_withdrawal": "Voc\u00ea est\u00e1 criando uma sa\u00edda.",
|
||||||
"you_create_transfer": "Voc\u00ea est\u00e1 criando uma transfer\u00eancia.",
|
"you_create_transfer": "Voc\u00ea est\u00e1 criando uma transfer\u00eancia.",
|
||||||
"you_create_deposit": "Voc\u00ea est\u00e1 criando uma entrada.",
|
"you_create_deposit": "Voc\u00ea est\u00e1 criando uma entrada.",
|
||||||
@@ -140,21 +140,21 @@
|
|||||||
"response": "Resposta",
|
"response": "Resposta",
|
||||||
"visit_webhook_url": "Acesse a URL do webhook",
|
"visit_webhook_url": "Acesse a URL do webhook",
|
||||||
"reset_webhook_secret": "Redefinir chave do webhook",
|
"reset_webhook_secret": "Redefinir chave do webhook",
|
||||||
"header_exchange_rates": "Exchange rates",
|
"header_exchange_rates": "Taxa de c\u00e2mbio",
|
||||||
"exchange_rates_intro": "Firefly III supports downloading and using exchange rates. Read more about this in <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">the documentation<\/a>.",
|
"exchange_rates_intro": "O Firefly III suporta o download e uso de taxas de c\u00e2mbio. Leia mais sobre isso <a href=\"https:\/\/docs.firefly-iii.org\/explanation\/financial-concepts\/exchange-rates\/\">na documenta\u00e7\u00e3o<\/a>.",
|
||||||
"exchange_rates_from_to": "Between {from} and {to} (and the other way around)",
|
"exchange_rates_from_to": "Entre {from} e {to} (e vice-versa)",
|
||||||
"exchange_rates_intro_rates": "Firefly III uses the following exchange rates. The inverse is automatically calculated when it is not provided. If no exchange rate exists for the date of the transaction, Firefly III will go back in time to find one. If none are present, the rate \"1\" will be used.",
|
"exchange_rates_intro_rates": "O Firefly III usa as seguintes taxas de c\u00e2mbio. A inversa \u00e9 automaticamente calculada quando n\u00e3o \u00e9 fornecida. Se n\u00e3o existir nenhuma taxa de c\u00e2mbio para a data da transa\u00e7\u00e3o, o Firefly III voltar\u00e1 no tempo para encontrar uma. Se nenhum estiver presente, a taxa \"1\" ser\u00e1 usada.",
|
||||||
"header_exchange_rates_rates": "Exchange rates",
|
"header_exchange_rates_rates": "Taxa de c\u00e2mbio",
|
||||||
"header_exchange_rates_table": "Table with exchange rates",
|
"header_exchange_rates_table": "Tabela com taxas de c\u00e2mbio",
|
||||||
"help_rate_form": "On this day, how many {to} will you get for one {from}?",
|
"help_rate_form": "Neste dia, quantos {to} voc\u00ea receber\u00e1 por um {from}?",
|
||||||
"add_new_rate": "Add a new exchange rate",
|
"add_new_rate": "Adicionar uma nova taxa de c\u00e2mbio",
|
||||||
"save_new_rate": "Save new rate"
|
"save_new_rate": "Salvar nova taxa"
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"active": "Ativo",
|
"active": "Ativo",
|
||||||
"interest_date": "Data do juros",
|
"interest_date": "Data do juros",
|
||||||
"administration_currency": "Native currency",
|
"administration_currency": "Moeda nativa",
|
||||||
"title": "T\u00edtulo",
|
"title": "T\u00edtulo",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"book_date": "Data de lan\u00e7amento",
|
"book_date": "Data de lan\u00e7amento",
|
||||||
@@ -169,12 +169,12 @@
|
|||||||
"webhook_delivery": "Entrega",
|
"webhook_delivery": "Entrega",
|
||||||
"from_currency_to_currency": "{from} → {to}",
|
"from_currency_to_currency": "{from} → {to}",
|
||||||
"to_currency_from_currency": "{to} → {from}",
|
"to_currency_from_currency": "{to} → {from}",
|
||||||
"rate": "Rate"
|
"rate": "Taxa"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "T\u00edtulo",
|
"title": "T\u00edtulo",
|
||||||
"active": "Est\u00e1 ativo?",
|
"active": "Est\u00e1 ativo?",
|
||||||
"native_currency": "Native currency",
|
"native_currency": "Moeda nativa",
|
||||||
"trigger": "Gatilho",
|
"trigger": "Gatilho",
|
||||||
"response": "Resposta",
|
"response": "Resposta",
|
||||||
"delivery": "Entrega",
|
"delivery": "Entrega",
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div class="progress-bar" role="progressbar" aria-valuenow="{{ entry.percentage }}" aria-valuemin="0" aria-valuemax="100"
|
<div class="progress-bar" role="progressbar" aria-valuenow="{{ entry.percentage }}" aria-valuemin="0" aria-valuemax="100"
|
||||||
style="width: {{ entry.percentage }}%;">
|
style="width: {{ entry.percentage }}%;">
|
||||||
{% if entry.percentage >=20 %}
|
{% if entry.percentage >=20 %}
|
||||||
{% if convertToNative %}
|
{% if convertToNative and 0 != avg.native_amount %}
|
||||||
{{ formatAmountBySymbol(entry.native_amount, entry.native_currency_symbol, entry.native_currency_decimal_places, false) }}
|
{{ formatAmountBySymbol(entry.native_amount, entry.native_currency_symbol, entry.native_currency_decimal_places, false) }}
|
||||||
({{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }})
|
({{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }})
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if entry.percentage < 20 %}
|
{% if entry.percentage < 20 %}
|
||||||
|
|
||||||
{% if convertToNative %}
|
{% if convertToNative and 0 != avg.native_amount %}
|
||||||
{{ formatAmountBySymbol(entry.native_amount, entry.native_currency_symbol, entry.native_currency_decimal_places, false) }}
|
{{ formatAmountBySymbol(entry.native_amount, entry.native_currency_symbol, entry.native_currency_decimal_places, false) }}
|
||||||
({{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }})
|
({{ formatAmountBySymbol(entry.amount, entry.currency_symbol, entry.currency_decimal_places, false) }})
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -295,6 +295,7 @@
|
|||||||
<ul class="dropdown-menu dropdown-menu-right" role="menu">
|
<ul class="dropdown-menu dropdown-menu-right" role="menu">
|
||||||
<li><a href="{{ route('transactions.edit', [group.id]) }}"><span
|
<li><a href="{{ route('transactions.edit', [group.id]) }}"><span
|
||||||
class="fa fa-fw fa-pencil"></span> {{ 'edit'|_ }}</a></li>
|
class="fa fa-fw fa-pencil"></span> {{ 'edit'|_ }}</a></li>
|
||||||
|
{% if transaction.transaction_type_type != 'Reconciliation' and transaction.transaction_type_type != 'Opening balance' and transaction.transaction_type_type != 'Liability credit' %}
|
||||||
<li><a href="{{ route('transactions.delete', [group.id]) }}"><span
|
<li><a href="{{ route('transactions.delete', [group.id]) }}"><span
|
||||||
class="fa fa-fw fa-trash"></span> {{ 'delete'|_ }}</a></li>
|
class="fa fa-fw fa-trash"></span> {{ 'delete'|_ }}</a></li>
|
||||||
<li><a href="#" data-id="{{ group.id }}" class="clone-transaction"><span
|
<li><a href="#" data-id="{{ group.id }}" class="clone-transaction"><span
|
||||||
@@ -305,6 +306,7 @@
|
|||||||
<a href="{{ route('rules.create-from-journal', [transaction.transaction_journal_id]) }}"><span
|
<a href="{{ route('rules.create-from-journal', [transaction.transaction_journal_id]) }}"><span
|
||||||
class="fa fa-fw fa-random"></span> {{ 'create_rule_from_transaction'|_ }}
|
class="fa fa-fw fa-random"></span> {{ 'create_rule_from_transaction'|_ }}
|
||||||
</a></li>
|
</a></li>
|
||||||
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
@@ -316,12 +318,14 @@
|
|||||||
</td>
|
</td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<td style="{{ style|raw }}" class="hidden-xs">
|
<td style="{{ style|raw }}" class="hidden-xs">
|
||||||
|
{% if transaction.transaction_type_type != 'Reconciliation' and transaction.transaction_type_type != 'Opening balance' and transaction.transaction_type_type != 'Liability credit' %}
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
<input id="list_{{ transaction.transaction_journal_id }}"
|
<input id="list_{{ transaction.transaction_journal_id }}"
|
||||||
value="{{ transaction.transaction_journal_id }}"
|
value="{{ transaction.transaction_journal_id }}"
|
||||||
name="journals[{{ transaction.transaction_journal_id }}]"
|
name="journals[{{ transaction.transaction_journal_id }}]"
|
||||||
type="checkbox" class="mass-select form-check-inline"
|
type="checkbox" class="mass-select form-check-inline"
|
||||||
data-value="{{ transaction.transaction_journal_id }}"/>
|
data-value="{{ transaction.transaction_journal_id }}"/>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -19,8 +19,11 @@
|
|||||||
{# edit + delete #}
|
{# edit + delete #}
|
||||||
<li><a href="{{ route('transactions.edit', [transactionGroup.id]) }}"><span
|
<li><a href="{{ route('transactions.edit', [transactionGroup.id]) }}"><span
|
||||||
class="fa fa-pencil"></span> {{ 'edit'|_ }}</a></li>
|
class="fa fa-pencil"></span> {{ 'edit'|_ }}</a></li>
|
||||||
|
{% if groupArray.transactions[0].type != 'reconciliation' and groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'liability credit' %}
|
||||||
<li><a href="{{ route('transactions.delete', [transactionGroup.id]) }}"><span
|
<li><a href="{{ route('transactions.delete', [transactionGroup.id]) }}"><span
|
||||||
class="fa fa-trash"></span> {{ 'delete'|_ }}</a></li>
|
class="fa fa-trash"></span> {{ 'delete'|_ }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% if groupArray.transactions[0].type != 'reconciliation' and groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'liability credit' %}
|
||||||
<li role="separator" class="divider"></li>
|
<li role="separator" class="divider"></li>
|
||||||
|
|
||||||
{# convert to different type #}
|
{# convert to different type #}
|
||||||
@@ -42,6 +45,7 @@
|
|||||||
class="fa fa-exchange"></span> {{ 'convert_to_transfer'|_ }}</a></li>
|
class="fa fa-exchange"></span> {{ 'convert_to_transfer'|_ }}</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
{# clone #}
|
{# clone #}
|
||||||
{% if groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'reconciliation' %}
|
{% if groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'reconciliation' %}
|
||||||
<li role="separator" class="divider"></li>
|
<li role="separator" class="divider"></li>
|
||||||
@@ -50,6 +54,7 @@
|
|||||||
<li><a href="#" class="clone-transaction-and-edit" data-id="{{ transactionGroup.id }}"><span
|
<li><a href="#" class="clone-transaction-and-edit" data-id="{{ transactionGroup.id }}"><span
|
||||||
class="fa fa-copy"></span> {{ 'clone_and_edit'|_ }}</a></li>
|
class="fa fa-copy"></span> {{ 'clone_and_edit'|_ }}</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -223,12 +228,15 @@
|
|||||||
{# edit + delete #}
|
{# edit + delete #}
|
||||||
<li><a href="{{ route('transactions.edit', [transactionGroup.id]) }}"><span
|
<li><a href="{{ route('transactions.edit', [transactionGroup.id]) }}"><span
|
||||||
class="fa fa-pencil"></span> {{ 'edit'|_ }}</a></li>
|
class="fa fa-pencil"></span> {{ 'edit'|_ }}</a></li>
|
||||||
|
{% if groupArray.transactions[0].type != 'reconciliation' and groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'liability credit' %}
|
||||||
<li><a href="{{ route('transactions.delete', [transactionGroup.id]) }}"><span
|
<li><a href="{{ route('transactions.delete', [transactionGroup.id]) }}"><span
|
||||||
class="fa fa-trash"></span> {{ 'delete'|_ }}</a></li>
|
class="fa fa-trash"></span> {{ 'delete'|_ }}</a></li>
|
||||||
|
{% endif %}
|
||||||
{% if journal.reconciled %}
|
{% if journal.reconciled %}
|
||||||
<li><a class="reconcile-button" href="{{ route('transactions.unreconcile', [journal.transaction_journal_id]) }}"><span
|
<li><a class="reconcile-button" href="{{ route('transactions.unreconcile', [journal.transaction_journal_id]) }}"><span
|
||||||
class="fa fa-history"></span> {{ 'unreconcile'|_ }}</a></li>
|
class="fa fa-history"></span> {{ 'unreconcile'|_ }}</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if groupArray.transactions[0].type != 'reconciliation' and groupArray.transactions[0].type != 'opening balance' and groupArray.transactions[0].type != 'liability credit' %}
|
||||||
<li role="separator" class="divider"></li>
|
<li role="separator" class="divider"></li>
|
||||||
|
|
||||||
{# convert to different type #}
|
{# convert to different type #}
|
||||||
@@ -273,6 +281,7 @@
|
|||||||
<a href="{{ route('recurring.create-from-journal', [journal.transaction_journal_id]) }}"><span
|
<a href="{{ route('recurring.create-from-journal', [journal.transaction_journal_id]) }}"><span
|
||||||
class="fa fa-fw fa-paint-brush"></span>{{ 'create_recurring_from_transaction'|_ }}
|
class="fa fa-fw fa-paint-brush"></span>{{ 'create_recurring_from_transaction'|_ }}
|
||||||
</a></li>
|
</a></li>
|
||||||
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user