Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop

This commit is contained in:
James Cole 2020-01-09 06:10:31 +01:00
commit 5cfa9bcc30
7 changed files with 81 additions and 74 deletions

View File

@ -4,7 +4,7 @@ about: Ask away!
--- ---
I am running Firefly III version x.x.x I am running Firefly III version x.x.x.
**Description** **Description**
<!-- (if relevant of course) --> <!-- (if relevant of course) -->
@ -13,10 +13,11 @@ I am running Firefly III version x.x.x
<!-- Please add extra info here, such as OS, browser, and the output from the `/debug`-page of your Firefly III installation (click the version at the bottom). --> <!-- Please add extra info here, such as OS, browser, and the output from the `/debug`-page of your Firefly III installation (click the version at the bottom). -->
**Bonus points** **Bonus points**
<!-- Earn bonus points by:
- Add a screenshot <!-- Complete the following checklist for bonus points -->
- Make a drawing
- Donate money (just kidding ;) - [ ] I have read the FAQ at https://bit.ly/FF3-FAQ
- Replicate the problem on the demo site https://demo.firefly-iii.org/ - [ ] I added a screenshot
--> - [ ] I added log files (see https://bit.ly/FF3-get-logs)
- [ ] I was able to replicate the issue on the demo site.
<!-- - [ ] I donated money (this is a joke :wink:)-->

View File

@ -125,19 +125,17 @@ class OtherCurrenciesCorrections extends Command
if (isset($this->accountCurrencies[$accountId]) && $this->accountCurrencies[$accountId] instanceof TransactionCurrency) { if (isset($this->accountCurrencies[$accountId]) && $this->accountCurrencies[$accountId] instanceof TransactionCurrency) {
return $this->accountCurrencies[$accountId]; // @codeCoverageIgnore return $this->accountCurrencies[$accountId]; // @codeCoverageIgnore
} }
// TODO we can use getAccountCurrency() instead $currency = $this->accountRepos->getAccountCurrency($account);
$currencyId = (int)$this->accountRepos->getMetaValue($account, 'currency_id'); if (null === $currency) {
$result = $this->currencyRepos->findNull($currencyId);
if (null === $result) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$this->accountCurrencies[$accountId] = 0; $this->accountCurrencies[$accountId] = 0;
return null; return null;
// @codeCoverageIgnoreEnd // @codeCoverageIgnoreEnd
} }
$this->accountCurrencies[$accountId] = $result; $this->accountCurrencies[$accountId] = $currency;
return $result; return $currency;
} }

View File

@ -125,6 +125,14 @@ class AutoCompleteController extends Controller
$filtered = $result->unique('description'); $filtered = $result->unique('description');
$limited = $filtered->slice(0, 15); $limited = $filtered->slice(0, 15);
$array = $limited->toArray(); $array = $limited->toArray();
// duplicate 'description' value into 'name':
$array = array_map(
static function (array $journal) {
$journal['name'] = $journal['description'];
return $journal;
}, $array
);
return response()->json(array_values($array)); return response()->json(array_values($array));
} }
@ -174,6 +182,38 @@ class AutoCompleteController extends Controller
return response()->json($array); return response()->json($array);
} }
/**
* An auto-complete specifically for asset accounts and liabilities, used when mass updating and for rules mostly.
*
* @param Request $request
*
* @return JsonResponse
*/
public function assetAccounts(Request $request): JsonResponse
{
$search = $request->get('search');
/** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class);
// filter the account types:
$allowedAccountTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE];
Log::debug(sprintf('Now in expenseAccounts(%s). Filtering results.', $search), $allowedAccountTypes);
$return = [];
$result = $repository->searchAccount((string)$search, $allowedAccountTypes);
/** @var Account $account */
foreach ($result as $account) {
$return[] = [
'id' => $account->id,
'name' => $account->name,
'type' => $account->accountType->type,
];
}
return response()->json($return);
}
/** /**
* @param Request $request * @param Request $request
* *
@ -283,39 +323,6 @@ class AutoCompleteController extends Controller
return response()->json($return); return response()->json($return);
} }
/**
* An auto-complete specifically for asset accounts and liabilities, used when mass updating and for rules mostly.
*
* @param Request $request
*
* @return JsonResponse
*/
public function assetAccounts(Request $request): JsonResponse
{
$search = $request->get('search');
/** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class);
// filter the account types:
$allowedAccountTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE];
Log::debug(sprintf('Now in expenseAccounts(%s). Filtering results.', $search), $allowedAccountTypes);
$return = [];
$result = $repository->searchAccount((string)$search, $allowedAccountTypes);
/** @var Account $account */
foreach ($result as $account) {
$return[] = [
'id' => $account->id,
'name' => $account->name,
'type' => $account->accountType->type,
];
}
return response()->json($return);
}
/** /**
* @return JsonResponse * @return JsonResponse
* @codeCoverageIgnore * @codeCoverageIgnore
@ -328,12 +335,12 @@ class AutoCompleteController extends Controller
/** @var AccountRepositoryInterface $accountRepos */ /** @var AccountRepositoryInterface $accountRepos */
$accountRepos = app(AccountRepositoryInterface::class); $accountRepos = app(AccountRepositoryInterface::class);
$piggies = $repository->getPiggyBanks(); $piggies = $repository->getPiggyBanks();
$defaultCurrency = \Amount::getDefaultCurrency(); $defaultCurrency = \Amount::getDefaultCurrency();
$response = []; $response = [];
/** @var PiggyBank $piggy */ /** @var PiggyBank $piggy */
foreach ($piggies as $piggy) { foreach ($piggies as $piggy) {
$currency = $accountRepos->getAccountCurrency($piggy->account) ?? $defaultCurrency; $currency = $accountRepos->getAccountCurrency($piggy->account) ?? $defaultCurrency;
$currentAmount = $repository->getRepetition($piggy)->currentamount ?? '0'; $currentAmount = $repository->getRepetition($piggy)->currentamount ?? '0';
$piggy->name_with_amount = sprintf( $piggy->name_with_amount = sprintf(
'%s (%s / %s)', '%s (%s / %s)',
@ -341,7 +348,7 @@ class AutoCompleteController extends Controller
app('amount')->formatAnything($currency, $currentAmount, false), app('amount')->formatAnything($currency, $currentAmount, false),
app('amount')->formatAnything($currency, $piggy->targetamount, false), app('amount')->formatAnything($currency, $piggy->targetamount, false),
); );
$response[] = $piggy->toArray(); $response[] = $piggy->toArray();
} }
return response()->json($response); return response()->json($response);

View File

@ -76,7 +76,7 @@ class PiggyBankFormRequest extends Request
$rules = [ $rules = [
'name' => $nameRule, 'name' => $nameRule,
'account_id' => 'required|belongsToUser:accounts', 'account_id' => 'required|belongsToUser:accounts',
'targetamount' => 'required|numeric|more:0|max:1000000000', 'targetamount' => 'required|numeric|gte:0.01|max:1000000000',
'startdate' => 'date', 'startdate' => 'date',
'targetdate' => 'date|nullable', 'targetdate' => 'date|nullable',
'order' => 'integer|min:1', 'order' => 'integer|min:1',

View File

@ -243,7 +243,7 @@ class BudgetRepository implements BudgetRepositoryInterface
if ('' !== $query) { if ('' !== $query) {
$search->where('name', 'LIKE', sprintf('%%%s%%', $query)); $search->where('name', 'LIKE', sprintf('%%%s%%', $query));
} }
$search->orderBy('order', 'DESC') $search->orderBy('order', 'ASC')
->orderBy('name', 'ASC')->where('active', 1); ->orderBy('name', 'ASC')->where('active', 1);
return $search->get(); return $search->get();

View File

@ -77,12 +77,7 @@ class PiggyBankTransformer extends AbstractTransformer
$this->piggyRepos->setUser($account->user); $this->piggyRepos->setUser($account->user);
// get currency from account, or use default. // get currency from account, or use default.
// TODO we can use getAccountCurrency() instead $currency = $this->accountRepos->getAccountCurrency($account) ?? app('amount')->getDefaultCurrencyByUser($account->user);
$currencyId = (int)$this->accountRepos->getMetaValue($account, 'currency_id');
$currency = $this->currencyRepos->findNull($currencyId);
if (null === $currency) {
$currency = app('amount')->getDefaultCurrencyByUser($account->user);
}
// note // note
$notes = $this->piggyRepos->getNoteText($piggyBank); $notes = $this->piggyRepos->getNoteText($piggyBank);
@ -99,6 +94,7 @@ class PiggyBankTransformer extends AbstractTransformer
// target and percentage: // target and percentage:
$targetAmount = round($piggyBank->targetamount, $currency->decimal_places); $targetAmount = round($piggyBank->targetamount, $currency->decimal_places);
$targetAmount = 1 === bccomp('0.01', (string)$targetAmount) ? '0.01' : $targetAmount;
$percentage = (int)(0 !== bccomp('0', $currentAmountStr) ? $currentAmount / $targetAmount * 100 : 0); $percentage = (int)(0 !== bccomp('0', $currentAmountStr) ? $currentAmount / $targetAmount * 100 : 0);
$data = [ $data = [
'id' => (int)$piggyBank->id, 'id' => (int)$piggyBank->id,

View File

@ -57,7 +57,7 @@ return [
'at_least_one_action' => 'Rule must have at least one action.', 'at_least_one_action' => 'Rule must have at least one action.',
'base64' => 'This is not valid base64 encoded data.', 'base64' => 'This is not valid base64 encoded data.',
'model_id_invalid' => 'The given ID seems invalid for this model.', 'model_id_invalid' => 'The given ID seems invalid for this model.',
'more' => ':attribute must be larger than zero.', 'more' => ':attribute must be larger than ":more".',
'less' => ':attribute must be less than 10,000,000', 'less' => ':attribute must be less than 10,000,000',
'active_url' => 'The :attribute is not a valid URL.', 'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.', 'after' => 'The :attribute must be a date after :date.',
@ -121,19 +121,19 @@ return [
'string' => 'The :attribute must be a string.', 'string' => 'The :attribute must be a string.',
'url' => 'The :attribute format is invalid.', 'url' => 'The :attribute format is invalid.',
'timezone' => 'The :attribute must be a valid zone.', 'timezone' => 'The :attribute must be a valid zone.',
'2fa_code' => 'The :attribute field is invalid.', '2fa_code' => 'The :attribute field is invalid.',
'dimensions' => 'The :attribute has invalid image dimensions.', 'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.', 'distinct' => 'The :attribute field has a duplicate value.',
'file' => 'The :attribute must be a file.', 'file' => 'The :attribute must be a file.',
'in_array' => 'The :attribute field does not exist in :other.', 'in_array' => 'The :attribute field does not exist in :other.',
'present' => 'The :attribute field must be present.', 'present' => 'The :attribute field must be present.',
'amount_zero' => 'The total amount cannot be zero.', 'amount_zero' => 'The total amount cannot be zero.',
'current_target_amount' => 'The current amount must be less than the target amount.', 'current_target_amount' => 'The current amount must be less than the target amount.',
'unique_piggy_bank_for_user' => 'The name of the piggy bank must be unique.', 'unique_piggy_bank_for_user' => 'The name of the piggy bank must be unique.',
'secure_password' => 'This is not a secure password. Please try again. For more information, visit https://bit.ly/FF3-password-security', 'secure_password' => 'This is not a secure password. Please try again. For more information, visit https://bit.ly/FF3-password-security',
'valid_recurrence_rep_type' => 'Invalid repetition type for recurring transactions.', 'valid_recurrence_rep_type' => 'Invalid repetition type for recurring transactions.',
'valid_recurrence_rep_moment' => 'Invalid repetition moment for this type of repetition.', 'valid_recurrence_rep_moment' => 'Invalid repetition moment for this type of repetition.',
'invalid_account_info' => 'Invalid account information.', 'invalid_account_info' => 'Invalid account information.',
'attributes' => [ 'attributes' => [
'email' => 'email address', 'email' => 'email address',
'description' => 'description', 'description' => 'description',
@ -181,7 +181,7 @@ return [
'deposit_source_bad_data' => 'Could not find a valid source account when searching for ID ":id" or name ":name".', 'deposit_source_bad_data' => 'Could not find a valid source account when searching for ID ":id" or name ":name".',
'deposit_dest_need_data' => 'Need to get a valid destination account ID and/or valid destination account name to continue.', 'deposit_dest_need_data' => 'Need to get a valid destination account ID and/or valid destination account name to continue.',
'deposit_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".', 'deposit_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
'deposit_dest_wrong_type' => 'The submitted destination account is not of the right type.', 'deposit_dest_wrong_type' => 'The submitted destination account is not of the right type.',
'transfer_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.', 'transfer_source_need_data' => 'Need to get a valid source account ID and/or valid source account name to continue.',
'transfer_source_bad_data' => 'Could not find a valid source account when searching for ID ":id" or name ":name".', 'transfer_source_bad_data' => 'Could not find a valid source account when searching for ID ":id" or name ":name".',
@ -193,6 +193,11 @@ return [
'ob_dest_need_data' => 'Need to get a valid destination account ID and/or valid destination account name to continue.', 'ob_dest_need_data' => 'Need to get a valid destination account ID and/or valid destination account name to continue.',
'ob_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".', 'ob_dest_bad_data' => 'Could not find a valid destination account when searching for ID ":id" or name ":name".',
'generic_invalid_source' => 'You can\'t use this account as the source account.', 'generic_invalid_source' => 'You can\'t use this account as the source account.',
'generic_invalid_destination' => 'You can\'t use this account as the destination account.', 'generic_invalid_destination' => 'You can\'t use this account as the destination account.',
'gte.numeric' => 'The :attribute must be greater than or equal to :value.',
'gte.file' => 'The :attribute must be greater than or equal to :value kilobytes.',
'gte.string' => 'The :attribute must be greater than or equal to :value characters.',
'gte.array' => 'The :attribute must have :value items or more.',
]; ];