Merge branch 'develop' into 5.8-dev

# Conflicts:
#	app/Api/V1/Controllers/Chart/AccountController.php
#	app/Api/V1/Controllers/Insight/Expense/AccountController.php
#	app/Api/V1/Controllers/Insight/Expense/BillController.php
#	app/Api/V1/Controllers/Insight/Expense/BudgetController.php
#	app/Api/V1/Controllers/Insight/Expense/CategoryController.php
#	app/Api/V1/Controllers/Insight/Expense/PeriodController.php
#	app/Console/Commands/Upgrade/MigrateToGroups.php
#	app/Http/Controllers/Account/IndexController.php
#	app/Http/Controllers/Budget/AvailableBudgetController.php
#	app/Http/Controllers/Budget/BudgetLimitController.php
#	app/Http/Controllers/Budget/EditController.php
#	app/Http/Controllers/Chart/AccountController.php
#	app/Http/Controllers/Json/FrontpageController.php
#	app/Http/Controllers/PiggyBank/EditController.php
This commit is contained in:
James Cole 2022-12-24 06:15:26 +01:00
commit db478711ed
No known key found for this signature in database
GPG Key ID: B49A324B7EAD6D80
47 changed files with 428 additions and 306 deletions

View File

@ -202,6 +202,15 @@ AUTHENTICATION_GUARD=web
AUTHENTICATION_GUARD_HEADER=REMOTE_USER AUTHENTICATION_GUARD_HEADER=REMOTE_USER
AUTHENTICATION_GUARD_EMAIL= AUTHENTICATION_GUARD_EMAIL=
#
# Firefly III generates a basic keypair for your OAuth tokens.
# If you want, you can overrule the key with your own (secure) value.
# It's also possible to set PASSPORT_PUBLIC_KEY_FILE or PASSPORT_PRIVATE_KEY_FILE
# if you're using Docker secrets or similar solutions for secret management
#
PASSPORT_PRIVATE_KEY=
PASSPORT_PUBLIC_KEY=
# #
# Extra authentication settings # Extra authentication settings
# #

View File

@ -94,7 +94,7 @@ class AccountController extends Controller
'id' => (string) $expense['id'], 'id' => (string) $expense['id'],
'name' => $expense['name'], 'name' => $expense['name'],
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float) $expense['sum'], // float but on purpose. 'difference_float' => (float) $expense['sum'], // intentional float
'currency_id' => (string) $expense['currency_id'], 'currency_id' => (string) $expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
@ -126,7 +126,7 @@ class AccountController extends Controller
'id' => (string) $expense['id'], 'id' => (string) $expense['id'],
'name' => $expense['name'], 'name' => $expense['name'],
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float) $expense['sum'], // float but on purpose. 'difference_float' => (float) $expense['sum'], // intentional float
'currency_id' => (string) $expense['currency_id'], 'currency_id' => (string) $expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];

View File

@ -101,7 +101,7 @@ class BillController extends Controller
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$key]['difference'] = bcadd($response[$key]['difference'], $journal['amount']); $response[$key]['difference'] = bcadd($response[$key]['difference'], $journal['amount']);
$response[$key]['difference_float'] = (float) $response[$key]['difference']; // float but on purpose. $response[$key]['difference_float'] = (float) $response[$key]['difference']; // intentional float
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignKey] = $response[$foreignKey] ?? [ $response[$foreignKey] = $response[$foreignKey] ?? [
@ -111,7 +111,7 @@ class BillController extends Controller
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']); $response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']);
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // float but on purpose. $response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // intentional float
} }
} }
@ -154,7 +154,7 @@ class BillController extends Controller
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']);
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose. $response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // intentional float
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [
@ -164,7 +164,7 @@ class BillController extends Controller
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']);
$response[$foreignCurrencyId]['difference_float'] = (float) $response[$foreignCurrencyId]['difference']; // float but on purpose. $response[$foreignCurrencyId]['difference_float'] = (float) $response[$foreignCurrencyId]['difference']; // intentional float
} }
} }

View File

@ -91,7 +91,7 @@ class BudgetController extends Controller
'id' => (string) $budget->id, 'id' => (string) $budget->id,
'name' => $budget->name, 'name' => $budget->name,
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float) $expense['sum'], // float but on purpose. 'difference_float' => (float) $expense['sum'], // intentional float
'currency_id' => (string) $expense['currency_id'], 'currency_id' => (string) $expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
@ -120,7 +120,7 @@ class BudgetController extends Controller
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float) $expense['sum'], // float but on purpose. 'difference_float' => (float) $expense['sum'], // intentional float
'currency_id' => (string) $expense['currency_id'], 'currency_id' => (string) $expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];

View File

@ -92,7 +92,7 @@ class CategoryController extends Controller
'id' => (string) $category->id, 'id' => (string) $category->id,
'name' => $category->name, 'name' => $category->name,
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float) $expense['sum'], // float but on purpose. 'difference_float' => (float) $expense['sum'], // intentional float
'currency_id' => (string) $expense['currency_id'], 'currency_id' => (string) $expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];
@ -121,7 +121,7 @@ class CategoryController extends Controller
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$result[] = [ $result[] = [
'difference' => $expense['sum'], 'difference' => $expense['sum'],
'difference_float' => (float) $expense['sum'], // float but on purpose. 'difference_float' => (float) $expense['sum'], // intentional float
'currency_id' => (string) $expense['currency_id'], 'currency_id' => (string) $expense['currency_id'],
'currency_code' => $expense['currency_code'], 'currency_code' => $expense['currency_code'],
]; ];

View File

@ -65,7 +65,7 @@ class PeriodController extends Controller
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
]; ];
$response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']); $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']);
$response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose. $response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // intentional float
} }
if (0 !== $foreignCurrencyId) { if (0 !== $foreignCurrencyId) {
$response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [
@ -75,7 +75,7 @@ class PeriodController extends Controller
'currency_code' => $journal['foreign_currency_code'], 'currency_code' => $journal['foreign_currency_code'],
]; ];
$response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']);
$response[$foreignCurrencyId]['difference_float'] = (float) $response[$foreignCurrencyId]['difference']; // float but on purpose. $response[$foreignCurrencyId]['difference_float'] = (float) $response[$foreignCurrencyId]['difference']; // intentional float
} }
} }

View File

@ -173,7 +173,7 @@ class TagController extends Controller
$response[$foreignKey]['difference'], $response[$foreignKey]['difference'],
app('steam')->positive($journal['foreign_amount']) app('steam')->positive($journal['foreign_amount'])
); );
$response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; $response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // intentional float
} }
} }
} }

View File

@ -189,7 +189,7 @@ class BasicController extends Controller
$return[] = [ $return[] = [
'key' => sprintf('balance-in-%s', $currency->code), 'key' => sprintf('balance-in-%s', $currency->code),
'title' => trans('firefly.box_balance_in_currency', ['currency' => $currency->symbol]), 'title' => trans('firefly.box_balance_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round((float) $sums[$currencyId] ?? 0, $currency->decimal_places), 'monetary_value' => $sums[$currencyId] ?? '0',
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
@ -202,7 +202,7 @@ class BasicController extends Controller
$return[] = [ $return[] = [
'key' => sprintf('spent-in-%s', $currency->code), 'key' => sprintf('spent-in-%s', $currency->code),
'title' => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]), 'title' => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round((float) ($expenses[$currencyId] ?? 0), $currency->decimal_places), 'monetary_value' => $expenses[$currencyId] ?? '0',
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
@ -214,7 +214,7 @@ class BasicController extends Controller
$return[] = [ $return[] = [
'key' => sprintf('earned-in-%s', $currency->code), 'key' => sprintf('earned-in-%s', $currency->code),
'title' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]), 'title' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round((float) ($incomes[$currencyId] ?? 0), $currency->decimal_places), 'monetary_value' => $incomes[$currencyId] ?? '0',
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
@ -252,7 +252,7 @@ class BasicController extends Controller
$return[] = [ $return[] = [
'key' => sprintf('bills-paid-in-%s', $currency->code), 'key' => sprintf('bills-paid-in-%s', $currency->code),
'title' => trans('firefly.box_bill_paid_in_currency', ['currency' => $currency->symbol]), 'title' => trans('firefly.box_bill_paid_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round((float) $amount, $currency->decimal_places), 'monetary_value' => $amount,
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
@ -272,7 +272,7 @@ class BasicController extends Controller
$return[] = [ $return[] = [
'key' => sprintf('bills-unpaid-in-%s', $currency->code), 'key' => sprintf('bills-unpaid-in-%s', $currency->code),
'title' => trans('firefly.box_bill_unpaid_in_currency', ['currency' => $currency->symbol]), 'title' => trans('firefly.box_bill_unpaid_in_currency', ['currency' => $currency->symbol]),
'monetary_value' => round((float) $amount, $currency->decimal_places), 'monetary_value' => $amount,
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
@ -316,7 +316,7 @@ class BasicController extends Controller
$return[] = [ $return[] = [
'key' => sprintf('left-to-spend-in-%s', $row['currency_code']), 'key' => sprintf('left-to-spend-in-%s', $row['currency_code']),
'title' => trans('firefly.box_left_to_spend_in_currency', ['currency' => $row['currency_symbol']]), 'title' => trans('firefly.box_left_to_spend_in_currency', ['currency' => $row['currency_symbol']]),
'monetary_value' => round((float) $leftToSpend, $row['currency_decimal_places']), 'monetary_value' => $leftToSpend,
'currency_id' => $row['currency_id'], 'currency_id' => $row['currency_id'],
'currency_code' => $row['currency_code'], 'currency_code' => $row['currency_code'],
'currency_symbol' => $row['currency_symbol'], 'currency_symbol' => $row['currency_symbol'],
@ -374,8 +374,8 @@ class BasicController extends Controller
foreach ($netWorthSet as $data) { foreach ($netWorthSet as $data) {
/** @var TransactionCurrency $currency */ /** @var TransactionCurrency $currency */
$currency = $data['currency']; $currency = $data['currency'];
$amount = round((float) $data['balance'], $currency->decimal_places); $amount = $data['balance'];
if (0.0 === $amount) { if (0 === bccomp($amount, '0')) {
continue; continue;
} }
// return stuff // return stuff

View File

@ -105,9 +105,10 @@ class StoreRequest extends FormRequest
$validator->after( $validator->after(
static function (Validator $validator) { static function (Validator $validator) {
$data = $validator->getData(); $data = $validator->getData();
$min = (float) ($data['amount_min'] ?? 0); $min = $data['amount_min'] ?? '0';
$max = (float) ($data['amount_max'] ?? 0); $max = $data['amount_max'] ?? '0';
if ($min > $max) {
if (1 === bccomp($min, $max)) {
$validator->errors()->add('amount_min', (string) trans('validation.amount_min_over_max')); $validator->errors()->add('amount_min', (string) trans('validation.amount_min_over_max'));
} }
} }

View File

@ -108,9 +108,10 @@ class UpdateRequest extends FormRequest
static function (Validator $validator) { static function (Validator $validator) {
$data = $validator->getData(); $data = $validator->getData();
if (array_key_exists('amount_min', $data) && array_key_exists('amount_max', $data)) { if (array_key_exists('amount_min', $data) && array_key_exists('amount_max', $data)) {
$min = (float) ($data['amount_min'] ?? 0); $min = $data['amount_min'] ?? '0';
$max = (float) ($data['amount_max'] ?? 0); $max = $data['amount_max'] ?? '0';
if ($min > $max) {
if (1 === bccomp($min, $max)) {
$validator->errors()->add('amount_min', (string) trans('validation.amount_min_over_max')); $validator->errors()->add('amount_min', (string) trans('validation.amount_min_over_max'));
} }
} }

View File

@ -47,6 +47,7 @@ class PreferenceStoreRequest extends FormRequest
if ('false' === $array['data']) { if ('false' === $array['data']) {
$array['data'] = false; $array['data'] = false;
} }
// TODO remove float
if (is_numeric($array['data'])) { if (is_numeric($array['data'])) {
$array['data'] = (float) $array['data']; $array['data'] = (float) $array['data'];
} }

View File

@ -48,6 +48,7 @@ class PreferenceUpdateRequest extends FormRequest
if ('false' === $array['data']) { if ('false' === $array['data']) {
$array['data'] = false; $array['data'] = false;
} }
// TODO remove float
if (is_numeric($array['data'])) { if (is_numeric($array['data'])) {
$array['data'] = (float) $array['data']; $array['data'] = (float) $array['data'];
} }

View File

@ -328,7 +328,7 @@ class MigrateToGroups extends Command
{ {
$set = $journal->transactions->filter( $set = $journal->transactions->filter(
static function (Transaction $subject) use ($transaction) { static function (Transaction $subject) use ($transaction) {
$amount = (float)$transaction->amount * -1 === (float)$subject->amount; $amount = (float) $transaction->amount * -1 === (float) $subject->amount; // intentional float
$identifier = $transaction->identifier === $subject->identifier; $identifier = $transaction->identifier === $subject->identifier;
Log::debug(sprintf('Amount the same? %s', var_export($amount, true))); Log::debug(sprintf('Amount the same? %s', var_export($amount, true)));
Log::debug(sprintf('ID the same? %s', var_export($identifier, true))); Log::debug(sprintf('ID the same? %s', var_export($identifier, true)));

View File

@ -80,8 +80,8 @@ class TagFactory
public function create(array $data): ?Tag public function create(array $data): ?Tag
{ {
$zoomLevel = 0 === (int) $data['zoom_level'] ? null : (int) $data['zoom_level']; $zoomLevel = 0 === (int) $data['zoom_level'] ? null : (int) $data['zoom_level'];
$latitude = 0.0 === (float) $data['latitude'] ? null : (float) $data['latitude']; $latitude = 0.0 === (float) $data['latitude'] ? null : (float) $data['latitude']; // intentional float
$longitude = 0.0 === (float) $data['longitude'] ? null : (float) $data['longitude']; $longitude = 0.0 === (float) $data['longitude'] ? null : (float) $data['longitude']; // intentional float
$array = [ $array = [
'user_id' => $this->user->id, 'user_id' => $this->user->id,
'tag' => trim($data['tag']), 'tag' => trim($data['tag']),

View File

@ -59,7 +59,7 @@ class ChartJsGenerator implements GeneratorInterface
$index = 0; $index = 0;
foreach ($data as $key => $valueArray) { foreach ($data as $key => $valueArray) {
// make larger than 0 // make larger than 0
$chartData['datasets'][0]['data'][] = (float) app('steam')->positive((string) $valueArray['amount']); $chartData['datasets'][0]['data'][] = app('steam')->positive((string) $valueArray['amount']);
$chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index); $chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index);
$chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol']; $chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol'];
$chartData['labels'][] = $key; $chartData['labels'][] = $key;
@ -174,7 +174,7 @@ class ChartJsGenerator implements GeneratorInterface
$index = 0; $index = 0;
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
// make larger than 0 // make larger than 0
$chartData['datasets'][0]['data'][] = (float) app('steam')->positive((string) $value); $chartData['datasets'][0]['data'][] = app('steam')->positive((string) $value);
$chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index); $chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index);
$chartData['labels'][] = $key; $chartData['labels'][] = $key;

View File

@ -135,6 +135,7 @@ class EditController extends Controller
// code to handle active-checkboxes // code to handle active-checkboxes
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
$virtualBalance = null === $account->virtual_balance ? '0' : $account->virtual_balance;
$preFilled = [ $preFilled = [
'account_number' => $repository->getMetaValue($account, 'account_number'), 'account_number' => $repository->getMetaValue($account, 'account_number'),
'account_role' => $repository->getMetaValue($account, 'account_role'), 'account_role' => $repository->getMetaValue($account, 'account_role'),
@ -143,9 +144,9 @@ class EditController extends Controller
'BIC' => $repository->getMetaValue($account, 'BIC'), 'BIC' => $repository->getMetaValue($account, 'BIC'),
'opening_balance_date' => $openingBalanceDate, 'opening_balance_date' => $openingBalanceDate,
'liability_type_id' => $account->account_type_id, 'liability_type_id' => $account->account_type_id,
'opening_balance' => number_format((float) $openingBalanceAmount, $currency->decimal_places, '.', ''), 'opening_balance' => app('steam')->bcround($openingBalanceAmount, $currency->decimal_places),
'liability_direction' => $this->repository->getMetaValue($account, 'liability_direction'), 'liability_direction' => $this->repository->getMetaValue($account, 'liability_direction'),
'virtual_balance' => number_format((float) $account->virtual_balance, $currency->decimal_places, '.', ''), 'virtual_balance' => app('steam')->bcround($virtualBalance, $currency->decimal_places),
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'include_net_worth' => $includeNetWorth, 'include_net_worth' => $includeNetWorth,
'interest' => $repository->getMetaValue($account, 'interest'), 'interest' => $repository->getMetaValue($account, 'interest'),

View File

@ -106,7 +106,7 @@ class IndexController extends Controller
$account->startBalance = $this->isInArray($startBalances, $account->id); $account->startBalance = $this->isInArray($startBalances, $account->id);
$account->endBalance = $this->isInArray($endBalances, $account->id); $account->endBalance = $this->isInArray($endBalances, $account->id);
$account->difference = bcsub($account->endBalance, $account->startBalance); $account->difference = bcsub($account->endBalance, $account->startBalance);
$account->interest = number_format((float) $this->repository->getMetaValue($account, 'interest'), 4, '.', ''); $account->interest = app('steam')->bcround($this->repository->getMetaValue($account, 'interest'), 4);
$account->interestPeriod = (string) trans(sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period'))); $account->interestPeriod = (string) trans(sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period')));
$account->accountTypeString = (string) trans(sprintf('firefly.account_type_%s', $account->accountType->type)); $account->accountTypeString = (string) trans(sprintf('firefly.account_type_%s', $account->accountType->type));
$account->current_debt = '0'; $account->current_debt = '0';
@ -163,14 +163,19 @@ class IndexController extends Controller
$endBalances = app('steam')->balancesByAccounts($accounts, $end); $endBalances = app('steam')->balancesByAccounts($accounts, $end);
$activities = app('steam')->getLastActivities($ids); $activities = app('steam')->getLastActivities($ids);
$accounts->each( $accounts->each(
function (Account $account) use ($activities, $startBalances, $endBalances) { function (Account $account) use ($activities, $startBalances, $endBalances) {
// TODO lots of queries in this block of code.
$interest = (string)$this->repository->getMetaValue($account, 'interest');
$interest = '' === $interest ? '0' : $interest;
// See reference nr. 68
$account->lastActivityDate = $this->isInArrayDate($activities, $account->id); $account->lastActivityDate = $this->isInArrayDate($activities, $account->id);
$account->startBalance = $this->isInArray($startBalances, $account->id); $account->startBalance = $this->isInArray($startBalances, $account->id);
$account->endBalance = $this->isInArray($endBalances, $account->id); $account->endBalance = $this->isInArray($endBalances, $account->id);
$account->difference = bcsub($account->endBalance, $account->startBalance); $account->difference = bcsub($account->endBalance, $account->startBalance);
$account->interest = number_format((float) $this->repository->getMetaValue($account, 'interest'), 4, '.', ''); $account->interest = app('steam')->bcround($interest, 4);
$account->interestPeriod = (string) trans( $account->interestPeriod = (string) trans(
sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period')) sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period'))
); );

View File

@ -124,8 +124,8 @@ class ReconcileController extends Controller
$startDate = clone $start; $startDate = clone $start;
$startDate->subDay(); $startDate->subDay();
$startBalance = number_format((float) app('steam')->balance($account, $startDate), $currency->decimal_places, '.', ''); $startBalance = app('steam')->bcround(app('steam')->balance($account, $startDate), $currency->decimal_places);
$endBalance = number_format((float) app('steam')->balance($account, $end), $currency->decimal_places, '.', ''); $endBalance = app('steam')->bcround( app('steam')->balance($account, $end), $currency->decimal_places);
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type)); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type));
$subTitle = (string) trans('firefly.reconcile_account', ['account' => $account->name]); $subTitle = (string) trans('firefly.reconcile_account', ['account' => $account->name]);

View File

@ -157,7 +157,7 @@ class RegisterController extends Controller
$allowRegistration = $this->allowedToRegister(); $allowRegistration = $this->allowedToRegister();
if (false === $allowRegistration) { if (false === $allowRegistration) {
$message = 'Registration is currently not available.'; $message = 'Registration is currently not available. If you are the administrator, you can enable this in the administration.';
return view('error', compact('message')); return view('error', compact('message'));
} }

View File

@ -89,8 +89,8 @@ class EditController extends Controller
} }
$currency = app('amount')->getDefaultCurrency(); $currency = app('amount')->getDefaultCurrency();
$bill->amount_min = round((float) $bill->amount_min, $currency->decimal_places); $bill->amount_min = app('steam')->bcround($bill->amount_min, $currency->decimal_places);
$bill->amount_max = round((float) $bill->amount_max, $currency->decimal_places); $bill->amount_max = app('steam')->bcround($bill->amount_max, $currency->decimal_places);
$rules = $this->repository->getRulesForBill($bill); $rules = $this->repository->getRulesForBill($bill);
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getDefaultCurrency();

View File

@ -65,7 +65,7 @@ class BudgetLimitController extends Controller
parent::__construct(); parent::__construct();
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string) trans('firefly.budgets')); app('view')->share('title', (string)trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-pie-chart'); app('view')->share('mainTitleIcon', 'fa-pie-chart');
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class);
@ -130,14 +130,14 @@ class BudgetLimitController extends Controller
{ {
Log::debug('Going to store new budget-limit.', $request->all()); Log::debug('Going to store new budget-limit.', $request->all());
// first search for existing one and update it if necessary. // first search for existing one and update it if necessary.
$currency = $this->currencyRepos->find((int) $request->get('transaction_currency_id')); $currency = $this->currencyRepos->find((int)$request->get('transaction_currency_id'));
$budget = $this->repository->find((int) $request->get('budget_id')); $budget = $this->repository->find((int)$request->get('budget_id'));
if (null === $currency || null === $budget) { if (null === $currency || null === $budget) {
throw new FireflyException('No valid currency or budget.'); throw new FireflyException('No valid currency or budget.');
} }
$start = Carbon::createFromFormat('Y-m-d', $request->get('start')); $start = Carbon::createFromFormat('Y-m-d', $request->get('start'));
$end = Carbon::createFromFormat('Y-m-d', $request->get('end')); $end = Carbon::createFromFormat('Y-m-d', $request->get('end'));
$amount = (string) $request->get('amount'); $amount = (string)$request->get('amount');
$start->startOfDay(); $start->startOfDay();
$end->startOfDay(); $end->startOfDay();
@ -150,17 +150,17 @@ class BudgetLimitController extends Controller
$limit = $this->blRepository->find($budget, $currency, $start, $end); $limit = $this->blRepository->find($budget, $currency, $start, $end);
// sanity check on amount: // sanity check on amount:
if ((float) $amount === 0.0) { if (0 === bccomp($amount, '0')) {
if (null !== $limit) { if (null !== $limit) {
$this->blRepository->destroyBudgetLimit($limit); $this->blRepository->destroyBudgetLimit($limit);
} }
// return empty=ish array: // return empty=ish array:
return response()->json([]); return response()->json([]);
} }
if ((int) $amount > 268435456) { if ((int)$amount > 268435456) { // intentional cast to integer
$amount = '268435456'; $amount = '268435456';
} }
if ((float) $amount < 0.0) { if (-1 === bccomp($amount, '0')) {
$amount = bcmul($amount, '-1'); $amount = bcmul($amount, '-1');
} }
@ -172,7 +172,7 @@ class BudgetLimitController extends Controller
$limit = $this->blRepository->store( $limit = $this->blRepository->store(
[ [
'budget_id' => $request->get('budget_id'), 'budget_id' => $request->get('budget_id'),
'currency_id' => (int) $request->get('transaction_currency_id'), 'currency_id' => (int)$request->get('transaction_currency_id'),
'start_date' => $start, 'start_date' => $start,
'end_date' => $end, 'end_date' => $end,
'amount' => $amount, 'amount' => $amount,
@ -187,7 +187,7 @@ class BudgetLimitController extends Controller
$array['spent'] = $spentArr[$currency->id]['sum'] ?? '0'; $array['spent'] = $spentArr[$currency->id]['sum'] ?? '0';
$array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount'])); $array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount']));
$array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']); $array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']);
$array['days_left'] = (string) $this->activeDaysLeft($start, $end); $array['days_left'] = (string)$this->activeDaysLeft($start, $end);
// left per day: // left per day:
$array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']); $array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']);
@ -208,13 +208,13 @@ class BudgetLimitController extends Controller
*/ */
public function update(Request $request, BudgetLimit $budgetLimit): JsonResponse public function update(Request $request, BudgetLimit $budgetLimit): JsonResponse
{ {
$amount = (string) $request->get('amount'); $amount = (string)$request->get('amount');
if ('' === $amount) { if ('' === $amount) {
$amount = '0'; $amount = '0';
} }
// sanity check on amount: // sanity check on amount:
if ((float) $amount === 0.0) { if (0 === bccomp($amount, '0')) {
$budgetId = $budgetLimit->budget_id; $budgetId = $budgetLimit->budget_id;
$currency = $budgetLimit->transactionCurrency; $currency = $budgetLimit->transactionCurrency;
$this->blRepository->destroyBudgetLimit($budgetLimit); $this->blRepository->destroyBudgetLimit($budgetLimit);
@ -226,10 +226,10 @@ class BudgetLimitController extends Controller
]; ];
return response()->json($array); return response()->json($array);
} }
if ((int) $amount > 268435456) { // 268 million if ((int)$amount > 268435456) { // 268 million, intentional integer
$amount = '268435456'; $amount = '268435456';
} }
if ((float) $amount < 0.0) { if (-1 === bccomp($amount, '0')) {
$amount = bcmul($amount, '-1'); $amount = bcmul($amount, '-1');
} }
@ -246,12 +246,12 @@ class BudgetLimitController extends Controller
$array['spent'] = $spentArr[$budgetLimit->transactionCurrency->id]['sum'] ?? '0'; $array['spent'] = $spentArr[$budgetLimit->transactionCurrency->id]['sum'] ?? '0';
$array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount'])); $array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount']));
$array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']); $array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']);
$array['days_left'] = (string) $this->activeDaysLeft($limit->start_date, $limit->end_date); $array['days_left'] = (string)$this->activeDaysLeft($limit->start_date, $limit->end_date);
// left per day: // left per day:
$array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']); $array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']);
// left per day formatted. // left per day formatted.
$array['amount'] = number_format((float) $limit['amount'], $limit->transactionCurrency->decimal_places, '.', ''); $array['amount'] = app('steam')->bcround($limit['amount'], $limit->transactionCurrency->decimal_places);
$array['left_per_day_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $array['left_per_day']); $array['left_per_day_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $array['left_per_day']);
return response()->json($array); return response()->json($array);

View File

@ -56,7 +56,7 @@ class EditController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string) trans('firefly.budgets')); app('view')->share('title', (string)trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-pie-chart'); app('view')->share('mainTitleIcon', 'fa-pie-chart');
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
$this->attachments = app(AttachmentHelperInterface::class); $this->attachments = app(AttachmentHelperInterface::class);
@ -76,34 +76,34 @@ class EditController extends Controller
*/ */
public function edit(Request $request, Budget $budget) public function edit(Request $request, Budget $budget)
{ {
$subTitle = (string) trans('firefly.edit_budget', ['name' => $budget->name]); $subTitle = (string)trans('firefly.edit_budget', ['name' => $budget->name]);
$autoBudget = $this->repository->getAutoBudget($budget); $autoBudget = $this->repository->getAutoBudget($budget);
// auto budget types // auto budget types
$autoBudgetTypes = [ $autoBudgetTypes = [
0 => (string) trans('firefly.auto_budget_none'), 0 => (string)trans('firefly.auto_budget_none'),
AutoBudget::AUTO_BUDGET_RESET => (string) trans('firefly.auto_budget_reset'), AutoBudget::AUTO_BUDGET_RESET => (string)trans('firefly.auto_budget_reset'),
AutoBudget::AUTO_BUDGET_ROLLOVER => (string) trans('firefly.auto_budget_rollover'), AutoBudget::AUTO_BUDGET_ROLLOVER => (string)trans('firefly.auto_budget_rollover'),
]; ];
$autoBudgetPeriods = [ $autoBudgetPeriods = [
'daily' => (string) trans('firefly.auto_budget_period_daily'), 'daily' => (string)trans('firefly.auto_budget_period_daily'),
'weekly' => (string) trans('firefly.auto_budget_period_weekly'), 'weekly' => (string)trans('firefly.auto_budget_period_weekly'),
'monthly' => (string) trans('firefly.auto_budget_period_monthly'), 'monthly' => (string)trans('firefly.auto_budget_period_monthly'),
'quarterly' => (string) trans('firefly.auto_budget_period_quarterly'), 'quarterly' => (string)trans('firefly.auto_budget_period_quarterly'),
'half_year' => (string) trans('firefly.auto_budget_period_half_year'), 'half_year' => (string)trans('firefly.auto_budget_period_half_year'),
'yearly' => (string) trans('firefly.auto_budget_period_yearly'), 'yearly' => (string)trans('firefly.auto_budget_period_yearly'),
]; ];
// code to handle active-checkboxes // code to handle active-checkboxes
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
$currency = app('amount')->getDefaultCurrency(); $currency = app('amount')->getDefaultCurrency();
$preFilled = [ $preFilled = [
'active' => $hasOldInput ? (bool) $request->old('active') : $budget->active, 'active' => $hasOldInput ? (bool)$request->old('active') : $budget->active,
'auto_budget_currency_id' => $hasOldInput ? (int) $request->old('auto_budget_currency_id') : $currency->id, 'auto_budget_currency_id' => $hasOldInput ? (int)$request->old('auto_budget_currency_id') : $currency->id,
]; ];
if ($autoBudget) { if ($autoBudget) {
$amount = $hasOldInput ? $request->old('auto_budget_amount') : $autoBudget->amount; $amount = $hasOldInput ? $request->old('auto_budget_amount') : $autoBudget->amount;
$preFilled['auto_budget_amount'] = number_format((float) $amount, $autoBudget->transactionCurrency->decimal_places, '.', ''); $preFilled['auto_budget_amount'] = app('steam')->bcround($amount, $autoBudget->transactionCurrency->decimal_places);
} }
// put previous url in session if not redirect from store (not "return_to_edit"). // put previous url in session if not redirect from store (not "return_to_edit").
@ -129,7 +129,7 @@ class EditController extends Controller
$data = $request->getBudgetData(); $data = $request->getBudgetData();
$this->repository->update($budget, $data); $this->repository->update($budget, $data);
$request->session()->flash('success', (string) trans('firefly.updated_budget', ['name' => $budget->name])); $request->session()->flash('success', (string)trans('firefly.updated_budget', ['name' => $budget->name]));
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
app('preferences')->mark(); app('preferences')->mark();
@ -141,14 +141,14 @@ class EditController extends Controller
$this->attachments->saveAttachmentsForModel($budget, $files); $this->attachments->saveAttachmentsForModel($budget, $files);
} }
if (null !== $files && auth()->user()->hasRole('demo')) { if (null !== $files && auth()->user()->hasRole('demo')) {
session()->flash('info', (string) trans('firefly.no_att_demo_user')); session()->flash('info', (string)trans('firefly.no_att_demo_user'));
} }
if (count($this->attachments->getMessages()->get('attachments')) > 0) { if (count($this->attachments->getMessages()->get('attachments')) > 0) {
$request->session()->flash('info', $this->attachments->getMessages()->get('attachments')); $request->session()->flash('info', $this->attachments->getMessages()->get('attachments'));
} }
if (1 === (int) $request->get('return_to_edit')) { if (1 === (int)$request->get('return_to_edit')) {
$request->session()->put('budgets.edit.fromUpdate', true); $request->session()->put('budgets.edit.fromUpdate', true);
$redirect = redirect(route('budgets.edit', [$budget->id]))->withInput(['return_to_edit' => 1]); $redirect = redirect(route('budgets.edit', [$budget->id]))->withInput(['return_to_edit' => 1]);

View File

@ -222,7 +222,7 @@ class IndexController extends Controller
$currency = $limit->transactionCurrency ?? $defaultCurrency; $currency = $limit->transactionCurrency ?? $defaultCurrency;
$array['budgeted'][] = [ $array['budgeted'][] = [
'id' => $limit->id, 'id' => $limit->id,
'amount' => number_format((float) $limit->amount, $currency->decimal_places, '.', ''), 'amount' => app('steam')->bcround($limit->amount, $currency->decimal_places),
'start_date' => $limit->start_date->isoFormat($this->monthAndDayFormat), 'start_date' => $limit->start_date->isoFormat($this->monthAndDayFormat),
'end_date' => $limit->end_date->isoFormat($this->monthAndDayFormat), 'end_date' => $limit->end_date->isoFormat($this->monthAndDayFormat),
'in_range' => $limit->start_date->isSameDay($start) && $limit->end_date->isSameDay($end), 'in_range' => $limit->start_date->isSameDay($start) && $limit->end_date->isSameDay($end),

View File

@ -130,7 +130,7 @@ class AccountController extends Controller
$tempData[] = [ $tempData[] = [
'name' => $accountNames[$accountId], 'name' => $accountNames[$accountId],
'difference' => $diff, 'difference' => $diff,
'diff_float' => (float)$diff, 'diff_float' => (float) $diff, // intentional float
'currency_id' => $currencyId, 'currency_id' => $currencyId,
]; ];
} }
@ -482,7 +482,6 @@ class AccountController extends Controller
]; ];
$entries = []; $entries = [];
$current = clone $start; $current = clone $start;
if ('1D' === $step) { if ('1D' === $step) {
// per day the entire period, balance for every day. // per day the entire period, balance for every day.
$format = (string)trans('config.month_and_day_js', [], $locale); $format = (string)trans('config.month_and_day_js', [], $locale);
@ -581,7 +580,7 @@ class AccountController extends Controller
$tempData[] = [ $tempData[] = [
'name' => $accountNames[$accountId], 'name' => $accountNames[$accountId],
'difference' => $diff, 'difference' => $diff,
'diff_float' => (float)$diff, 'diff_float' => (float) $diff, // intentional float
'currency_id' => $currencyId, 'currency_id' => $currencyId,
]; ];
} }

View File

@ -484,13 +484,13 @@ class BudgetController extends Controller
// get budget limit in this period for this currency. // get budget limit in this period for this currency.
$limit = $this->blRepository->find($budget, $currency, $currentStart, $currentEnd); $limit = $this->blRepository->find($budget, $currency, $currentStart, $currentEnd);
if (null !== $limit) { if (null !== $limit) {
$chartData[1]['entries'][$title] = round((float) $limit->amount, $currency->decimal_places); $chartData[1]['entries'][$title] = app('steam')->bcround($limit->amount, $currency->decimal_places);
} }
// get spent amount in this period for this currency. // get spent amount in this period for this currency.
$sum = $this->opsRepository->sumExpenses($currentStart, $currentEnd, $accounts, new Collection([$budget]), $currency); $sum = $this->opsRepository->sumExpenses($currentStart, $currentEnd, $accounts, new Collection([$budget]), $currency);
$amount = app('steam')->positive($sum[$currency->id]['sum'] ?? '0'); $amount = app('steam')->positive($sum[$currency->id]['sum'] ?? '0');
$chartData[0]['entries'][$title] = round((float) $amount, $currency->decimal_places); $chartData[0]['entries'][$title] = app('steam')->bcround($amount, $currency->decimal_places);
$currentStart = clone $currentEnd; $currentStart = clone $currentEnd;
$currentStart->addDay()->startOfDay(); $currentStart->addDay()->startOfDay();
@ -535,7 +535,7 @@ class BudgetController extends Controller
$title = $currentStart->isoFormat($titleFormat); $title = $currentStart->isoFormat($titleFormat);
$sum = $this->nbRepository->sumExpenses($currentStart, $currentEnd, $accounts, $currency); $sum = $this->nbRepository->sumExpenses($currentStart, $currentEnd, $accounts, $currency);
$amount = app('steam')->positive($sum[$currency->id]['sum'] ?? '0'); $amount = app('steam')->positive($sum[$currency->id]['sum'] ?? '0');
$chartData[$title] = round((float) $amount, $currency->decimal_places); $chartData[$title] = app('steam')->bcround($amount, $currency->decimal_places);
$currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0); $currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0);
} }

View File

@ -243,8 +243,8 @@ class ReportController extends Controller
while ($currentStart <= $end) { while ($currentStart <= $end) {
$key = $currentStart->format($format); $key = $currentStart->format($format);
$title = $currentStart->isoFormat($titleFormat); $title = $currentStart->isoFormat($titleFormat);
$income['entries'][$title] = round((float) ($currency[$key]['earned'] ?? '0'), $currency['currency_decimal_places']); $income['entries'][$title] = app('steam')->bcround(($currency[$key]['earned'] ?? '0'), $currency['currency_decimal_places']);
$expense['entries'][$title] = round((float) ($currency[$key]['spent'] ?? '0'), $currency['currency_decimal_places']); $expense['entries'][$title] = app('steam')->bcround(($currency[$key]['spent'] ?? '0'), $currency['currency_decimal_places']);
$currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0); $currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0);
} }

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* FrontpageController.php * FrontpageController.php
* Copyright (c) 2019 james@firefly-iii.org * Copyright (c) 2019 james@firefly-iii.org
@ -52,7 +53,7 @@ class FrontpageController extends Controller
if (1 === bccomp($amount, '0')) { if (1 === bccomp($amount, '0')) {
// percentage! // percentage!
$pct = 0; $pct = 0;
if (0.0 !== (float) $piggyBank->targetamount) { if (0 !== bccomp($piggyBank->targetamount, '0')) {
$pct = round(($amount / $piggyBank->targetamount) * 100); $pct = round(($amount / $piggyBank->targetamount) * 100);
} }

View File

@ -238,8 +238,8 @@ class ReconcileController extends Controller
$startDate->subDay(); $startDate->subDay();
$currency = $this->accountRepos->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency(); $currency = $this->accountRepos->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency();
$startBalance = round((float) app('steam')->balance($account, $startDate), $currency->decimal_places); $startBalance = app('steam')->bcround(app('steam')->balance($account, $startDate), $currency->decimal_places);
$endBalance = round((float) app('steam')->balance($account, $end), $currency->decimal_places); $endBalance = app('steam')->bcround(app('steam')->balance($account, $end), $currency->decimal_places);
// get the transactions // get the transactions
$selectionStart = clone $start; $selectionStart = clone $start;

View File

@ -77,7 +77,7 @@ class AmountController extends Controller
$leftOnAccount = $this->piggyRepos->leftOnAccount($piggyBank, today(config('app.timezone'))); $leftOnAccount = $this->piggyRepos->leftOnAccount($piggyBank, today(config('app.timezone')));
$savedSoFar = $this->piggyRepos->getCurrentAmount($piggyBank); $savedSoFar = $this->piggyRepos->getCurrentAmount($piggyBank);
$maxAmount = $leftOnAccount; $maxAmount = $leftOnAccount;
if (0.000 !== (float) $piggyBank->targetamount) { if (0 !== bccomp($piggyBank->targetamount,'0')) {
$leftToSave = bcsub($piggyBank->targetamount, $savedSoFar); $leftToSave = bcsub($piggyBank->targetamount, $savedSoFar);
$maxAmount = min($leftOnAccount, $leftToSave); $maxAmount = min($leftOnAccount, $leftToSave);
} }
@ -101,7 +101,7 @@ class AmountController extends Controller
$savedSoFar = $this->piggyRepos->getCurrentAmount($piggyBank); $savedSoFar = $this->piggyRepos->getCurrentAmount($piggyBank);
$maxAmount = $leftOnAccount; $maxAmount = $leftOnAccount;
if (0.000 !== (float) $piggyBank->targetamount) { if (0 !== bccomp($piggyBank->targetamount,'0')) {
$leftToSave = bcsub($piggyBank->targetamount, $savedSoFar); $leftToSave = bcsub($piggyBank->targetamount, $savedSoFar);
$maxAmount = min($leftOnAccount, $leftToSave); $maxAmount = min($leftOnAccount, $leftToSave);
} }
@ -181,7 +181,7 @@ class AmountController extends Controller
return redirect(route('piggy-banks.index')); return redirect(route('piggy-banks.index'));
} }
$amount = number_format((float) $request->get('amount'), 12, '.', ''); $amount = (string) $request->get('amount');
session()->flash( session()->flash(
'error', 'error',

View File

@ -56,7 +56,7 @@ class EditController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string) trans('firefly.piggyBanks')); app('view')->share('title', (string)trans('firefly.piggyBanks'));
app('view')->share('mainTitleIcon', 'fa-bullseye'); app('view')->share('mainTitleIcon', 'fa-bullseye');
$this->attachments = app(AttachmentHelperInterface::class); $this->attachments = app(AttachmentHelperInterface::class);
@ -76,7 +76,7 @@ class EditController extends Controller
*/ */
public function edit(PiggyBank $piggyBank) public function edit(PiggyBank $piggyBank)
{ {
$subTitle = (string) trans('firefly.update_piggy_title', ['name' => $piggyBank->name]); $subTitle = (string)trans('firefly.update_piggy_title', ['name' => $piggyBank->name]);
$subTitleIcon = 'fa-pencil'; $subTitleIcon = 'fa-pencil';
$note = $piggyBank->notes()->first(); $note = $piggyBank->notes()->first();
// Flash some data to fill the form. // Flash some data to fill the form.
@ -87,15 +87,16 @@ class EditController extends Controller
$currency = Amount::getDefaultCurrency(); $currency = Amount::getDefaultCurrency();
} }
$preFilled = ['name' => $piggyBank->name, $preFilled = [
'name' => $piggyBank->name,
'account_id' => $piggyBank->account_id, 'account_id' => $piggyBank->account_id,
'targetamount' => number_format((float) $piggyBank->targetamount, $currency->decimal_places, '.', ''), 'targetamount' => app('steam')->bcround($piggyBank->targetamount, $currency->decimal_places),
'targetdate' => $targetDate, 'targetdate' => $targetDate,
'startdate' => $startDate, 'startdate' => $startDate,
'object_group' => $piggyBank->objectGroups->first() ? $piggyBank->objectGroups->first()->title : '', 'object_group' => $piggyBank->objectGroups->first() ? $piggyBank->objectGroups->first()->title : '',
'notes' => null === $note ? '' : $note->text, 'notes' => null === $note ? '' : $note->text,
]; ];
if (0.0 === (float) $piggyBank->targetamount) { if (0 === bccomp($piggyBank->targetamount, '0')) {
$preFilled['targetamount'] = ''; $preFilled['targetamount'] = '';
} }
session()->flash('preFilled', $preFilled); session()->flash('preFilled', $preFilled);
@ -122,7 +123,7 @@ class EditController extends Controller
$data = $request->getPiggyBankData(); $data = $request->getPiggyBankData();
$piggyBank = $this->piggyRepos->update($piggyBank, $data); $piggyBank = $this->piggyRepos->update($piggyBank, $data);
session()->flash('success', (string) trans('firefly.updated_piggy_bank', ['name' => $piggyBank->name])); session()->flash('success', (string)trans('firefly.updated_piggy_bank', ['name' => $piggyBank->name]));
app('preferences')->mark(); app('preferences')->mark();
// store new attachment(s): // store new attachment(s):
@ -132,7 +133,7 @@ class EditController extends Controller
$this->attachments->saveAttachmentsForModel($piggyBank, $files); $this->attachments->saveAttachmentsForModel($piggyBank, $files);
} }
if (null !== $files && auth()->user()->hasRole('demo')) { if (null !== $files && auth()->user()->hasRole('demo')) {
session()->flash('info', (string) trans('firefly.no_att_demo_user')); session()->flash('info', (string)trans('firefly.no_att_demo_user'));
} }
if (count($this->attachments->getMessages()->get('attachments')) > 0) { if (count($this->attachments->getMessages()->get('attachments')) > 0) {
@ -140,7 +141,7 @@ class EditController extends Controller
} }
$redirect = redirect($this->getPreviousUrl('piggy-banks.edit.url')); $redirect = redirect($this->getPreviousUrl('piggy-banks.edit.url'));
if (1 === (int) $request->get('return_to_edit')) { if (1 === (int)$request->get('return_to_edit')) {
session()->put('piggy-banks.edit.fromUpdate', true); session()->put('piggy-banks.edit.fromUpdate', true);
$redirect = redirect(route('piggy-banks.edit', [$piggyBank->id])); $redirect = redirect(route('piggy-banks.edit', [$piggyBank->id]));

View File

@ -188,7 +188,7 @@ class BudgetController extends Controller
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float) $result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg']; // intentional float
} }
} }
} }
@ -267,7 +267,7 @@ class BudgetController extends Controller
$total = $sums[$currencyId]['sum'] ?? '0'; $total = $sums[$currencyId]['sum'] ?? '0';
$pct = '0'; $pct = '0';
if (0 !== bccomp($sum, '0') && 0 !== bccomp($total, '9')) { if (0 !== bccomp($sum, '0') && 0 !== bccomp($total, '9')) {
$pct = round((float) bcmul(bcdiv($sum, $total), '100')); $pct = round((float) bcmul(bcdiv($sum, $total), '100')); // intentional float
} }
$report[$budgetId]['currencies'][$currencyId]['sum_pct'] = $pct; $report[$budgetId]['currencies'][$currencyId]['sum_pct'] = $pct;
} }
@ -384,7 +384,7 @@ class BudgetController extends Controller
$result[] = [ $result[] = [
'description' => $journal['description'], 'description' => $journal['description'],
'transaction_group_id' => $journal['transaction_group_id'], 'transaction_group_id' => $journal['transaction_group_id'],
'amount_float' => (float) $journal['amount'], 'amount_float' => (float) $journal['amount'], // intentional float
'amount' => $journal['amount'], 'amount' => $journal['amount'],
'date' => $journal['date']->isoFormat($this->monthAndDayFormat), 'date' => $journal['date']->isoFormat($this->monthAndDayFormat),
'date_sort' => $journal['date']->format('Y-m-d'), 'date_sort' => $journal['date']->format('Y-m-d'),

View File

@ -302,7 +302,7 @@ class CategoryController extends Controller
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float) $result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg']; // intentional float
} }
} }
} }

View File

@ -137,6 +137,7 @@ class DeleteController extends Controller
Log::debug(sprintf('Now going to trigger updated account event for account #%d', $account->id)); Log::debug(sprintf('Now going to trigger updated account event for account #%d', $account->id));
event(new UpdatedAccount($account)); event(new UpdatedAccount($account));
} }
app('preferences')->mark();
return redirect($this->getPreviousUrl('transactions.delete.url')); return redirect($this->getPreviousUrl('transactions.delete.url'));

View File

@ -145,7 +145,7 @@ class MassController extends Controller
// reverse amounts // reverse amounts
foreach ($journals as $index => $journal) { foreach ($journals as $index => $journal) {
$journals[$index]['amount'] = number_format((float) app('steam')->positive($journal['amount']), $journal['currency_decimal_places'], '.', ''); $journals[$index]['amount'] = app('steam')->bcround(app('steam')->positive($journal['amount']), $journal['currency_decimal_places']);
$journals[$index]['foreign_amount'] = null === $journal['foreign_amount'] ? $journals[$index]['foreign_amount'] = null === $journal['foreign_amount'] ?
null : app('steam')->positive($journal['foreign_amount']); null : app('steam')->positive($journal['foreign_amount']);
} }

View File

@ -46,7 +46,7 @@ class PiggyBankUpdateRequest extends FormRequest
'name' => $this->convertString('name'), 'name' => $this->convertString('name'),
'startdate' => $this->getCarbonDate('startdate'), 'startdate' => $this->getCarbonDate('startdate'),
'account_id' => $this->convertInteger('account_id'), 'account_id' => $this->convertInteger('account_id'),
'targetamount' => $this->convertString('targetamount'), 'targetamount' => trim($this->convertString('targetamount')),
'targetdate' => $this->getCarbonDate('targetdate'), 'targetdate' => $this->getCarbonDate('targetdate'),
'notes' => $this->stringWithNewlines('notes'), 'notes' => $this->stringWithNewlines('notes'),
'object_group_title' => $this->convertString('object_group'), 'object_group_title' => $this->convertString('object_group'),

View File

@ -140,7 +140,7 @@ class AccountTasker implements AccountTaskerInterface
// Obtain a list of columns // Obtain a list of columns
$sum = []; $sum = [];
foreach ($report['accounts'] as $accountId => $row) { foreach ($report['accounts'] as $accountId => $row) {
$sum[$accountId] = (float) $row['sum']; $sum[$accountId] = (float) $row['sum']; // intentional float
} }
array_multisort($sum, SORT_ASC, $report['accounts']); array_multisort($sum, SORT_ASC, $report['accounts']);
@ -235,7 +235,7 @@ class AccountTasker implements AccountTaskerInterface
// Obtain a list of columns // Obtain a list of columns
$sum = []; $sum = [];
foreach ($report['accounts'] as $accountId => $row) { foreach ($report['accounts'] as $accountId => $row) {
$sum[$accountId] = (float) $row['sum']; $sum[$accountId] = (float) $row['sum']; // intentional float
} }
array_multisort($sum, SORT_DESC, $report['accounts']); array_multisort($sum, SORT_DESC, $report['accounts']);

View File

@ -138,7 +138,7 @@ class NoBudgetRepository implements NoBudgetRepositoryInterface
'currency_name' => $currency['name'], 'currency_name' => $currency['name'],
'currency_symbol' => $currency['symbol'], 'currency_symbol' => $currency['symbol'],
'currency_decimal_places' => $currency['decimal_places'], 'currency_decimal_places' => $currency['decimal_places'],
'amount' => number_format((float) $spent, $currency['decimal_places'], '.', ''), 'amount' => app('steam')->bcround($spent, $currency['decimal_places']),
]; ];
} }

View File

@ -273,7 +273,7 @@ class OperationsRepository implements OperationsRepositoryInterface
'currency_name' => $currency['name'], 'currency_name' => $currency['name'],
'currency_symbol' => $currency['symbol'], 'currency_symbol' => $currency['symbol'],
'currency_decimal_places' => $currency['decimal_places'], 'currency_decimal_places' => $currency['decimal_places'],
'amount' => number_format((float) $spent, $currency['decimal_places'], '.', ''), 'amount' => app('steam')->bcround($spent, $currency['decimal_places']),
]; ];
} }

View File

@ -96,7 +96,7 @@ trait ModifiesPiggyBanks
$savedSoFar = (string)$this->getRepetition($piggyBank)->currentamount; $savedSoFar = (string)$this->getRepetition($piggyBank)->currentamount;
$maxAmount = $leftOnAccount; $maxAmount = $leftOnAccount;
$leftToSave = null; $leftToSave = null;
if (0.0 !== (float)$piggyBank->targetamount) { if (0 !== bccomp($piggyBank->targetamount, '0')) {
$leftToSave = bcsub($piggyBank->targetamount, $savedSoFar); $leftToSave = bcsub($piggyBank->targetamount, $savedSoFar);
$maxAmount = 1 === bccomp($leftOnAccount, $leftToSave) ? $leftToSave : $leftOnAccount; $maxAmount = 1 === bccomp($leftOnAccount, $leftToSave) ? $leftToSave : $leftOnAccount;
} }
@ -383,7 +383,7 @@ trait ModifiesPiggyBanks
// if the piggy bank is now smaller than the current relevant rep, // if the piggy bank is now smaller than the current relevant rep,
// remove money from the rep. // remove money from the rep.
$repetition = $this->getRepetition($piggyBank); $repetition = $this->getRepetition($piggyBank);
if (null !== $repetition && $repetition->currentamount > $piggyBank->targetamount && 0.0 !== (float)$piggyBank->targetamount) { if (null !== $repetition && $repetition->currentamount > $piggyBank->targetamount && 0 !== bccomp($piggyBank->targetamount, '0')) {
$difference = bcsub($piggyBank->targetamount, $repetition->currentamount); $difference = bcsub($piggyBank->targetamount, $repetition->currentamount);
// an amount will be removed, create "negative" event: // an amount will be removed, create "negative" event:
@ -446,6 +446,9 @@ trait ModifiesPiggyBanks
if (array_key_exists('targetamount', $data) && '' !== $data['targetamount']) { if (array_key_exists('targetamount', $data) && '' !== $data['targetamount']) {
$piggyBank->targetamount = $data['targetamount']; $piggyBank->targetamount = $data['targetamount'];
} }
if (array_key_exists('targetamount', $data) && '' === $data['targetamount']) {
$piggyBank->targetamount = '0';
}
if (array_key_exists('targetdate', $data) && '' !== $data['targetdate']) { if (array_key_exists('targetdate', $data) && '' !== $data['targetdate']) {
$piggyBank->targetdate = $data['targetdate']; $piggyBank->targetdate = $data['targetdate'];
} }

View File

@ -203,7 +203,7 @@ class CreditRecalculateService
$factory->crud($account, 'start_of_debt', $startOfDebt); $factory->crud($account, 'start_of_debt', $startOfDebt);
// get direction of liability: // get direction of liability:
$direction = (string) $this->repository->getMetaValue($account, 'liability_direction'); $direction = (string)$this->repository->getMetaValue($account, 'liability_direction');
// now loop all transactions (except opening balance and credit thing) // now loop all transactions (except opening balance and credit thing)
$transactions = $account->transactions()->get(); $transactions = $account->transactions()->get();
@ -229,13 +229,25 @@ class CreditRecalculateService
{ {
Log::debug(sprintf('Now in %s(#%d, %s)', __METHOD__, $transaction->id, $amount)); Log::debug(sprintf('Now in %s(#%d, %s)', __METHOD__, $transaction->id, $amount));
$journal = $transaction->transactionJournal; $journal = $transaction->transactionJournal;
$foreignCurrency = $transaction->foreignCurrency;
$accountCurrency = $this->repository->getAccountCurrency($account);
$groupId = $journal->transaction_group_id; $groupId = $journal->transaction_group_id;
$type = $journal->transactionType->type; $type = $journal->transactionType->type;
Log::debug(sprintf('Account currency is #%d (%s)', $accountCurrency->id, $accountCurrency->code));
if ('' === $direction) { if ('' === $direction) {
Log::debug('Since direction is "", do nothing.'); Log::debug('Since direction is "", do nothing.');
return $amount; return $amount;
} }
// amount to use depends on the currency:
$usedAmount = $transaction->amount;
if (null !== $foreignCurrency && $foreignCurrency->id === $accountCurrency->id) {
$usedAmount = $transaction->foreign_amount;
Log::debug('Will now use foreign amount!');
}
Log::debug(sprintf('Processing group #%d, journal #%d of type "%s"', $journal->id, $groupId, $type)); Log::debug(sprintf('Processing group #%d, journal #%d of type "%s"', $journal->id, $groupId, $type));
@ -244,8 +256,8 @@ class CreditRecalculateService
// to a credit-liability doesn't increase the amount (yet) // to a credit-liability doesn't increase the amount (yet)
if ( if (
$type === TransactionType::WITHDRAWAL $type === TransactionType::WITHDRAWAL
&& (int) $account->id === (int) $transaction->account_id && (int)$account->id === (int)$transaction->account_id
&& 1 === bccomp($transaction->amount, '0') && 1 === bccomp($usedAmount, '0')
&& 'credit' === $direction && 'credit' === $direction
) { ) {
Log::debug(sprintf('Is withdrawal into credit liability #%d, does not influence the amount due.', $transaction->account_id)); Log::debug(sprintf('Is withdrawal into credit liability #%d, does not influence the amount due.', $transaction->account_id));
@ -256,8 +268,8 @@ class CreditRecalculateService
// likewise deposit into a credit debt does not change the amount // likewise deposit into a credit debt does not change the amount
if ( if (
$type === TransactionType::DEPOSIT $type === TransactionType::DEPOSIT
&& (int) $account->id === (int) $transaction->account_id && (int)$account->id === (int)$transaction->account_id
&& -1 === bccomp($transaction->amount, '0') && -1 === bccomp($usedAmount, '0')
&& 'credit' === $direction && 'credit' === $direction
) { ) {
Log::debug(sprintf('Is deposit from liability #%d,does not influence the amount left.', $transaction->account_id)); Log::debug(sprintf('Is deposit from liability #%d,does not influence the amount left.', $transaction->account_id));
@ -266,7 +278,7 @@ class CreditRecalculateService
} }
if (in_array($type, [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER], true)) { if (in_array($type, [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER], true)) {
$amount = bcadd($amount, bcmul($transaction->amount, '-1')); $amount = bcadd($amount, bcmul($usedAmount, '-1'));
} }
Log::debug(sprintf('Amount is now %s', $amount)); Log::debug(sprintf('Amount is now %s', $amount));

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Amount.php * Amount.php
* Copyright (c) 2019 james@firefly-iii.org * Copyright (c) 2019 james@firefly-iii.org
@ -51,7 +52,7 @@ class Amount
*/ */
public function formatAnything(TransactionCurrency $format, string $amount, bool $coloured = null): string public function formatAnything(TransactionCurrency $format, string $amount, bool $coloured = null): string
{ {
return $this->formatFlat($format->symbol, (int) $format->decimal_places, $amount, $coloured); return $this->formatFlat($format->symbol, (int)$format->decimal_places, $amount, $coloured);
} }
/** /**
@ -77,13 +78,13 @@ class Amount
$fmt->setSymbol(NumberFormatter::CURRENCY_SYMBOL, $symbol); $fmt->setSymbol(NumberFormatter::CURRENCY_SYMBOL, $symbol);
$fmt->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $decimalPlaces); $fmt->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $decimalPlaces);
$fmt->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimalPlaces); $fmt->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimalPlaces);
$result = $fmt->format((float) $amount); $result = $fmt->format((float)app('steam')->bcround($amount, $decimalPlaces)); // intentional float
if (true === $coloured) { if (true === $coloured) {
if ($amount > 0) { if (1 === bccomp($amount, '0')) {
return sprintf('<span class="text-success">%s</span>', $result); return sprintf('<span class="text-success">%s</span>', $result);
} }
if ($amount < 0) { if (-1 === bccomp($amount, '0')) {
return sprintf('<span class="text-danger">%s</span>', $result); return sprintf('<span class="text-danger">%s</span>', $result);
} }
@ -132,7 +133,7 @@ class Amount
} }
$cache->store(config('firefly.default_currency', 'EUR')); $cache->store(config('firefly.default_currency', 'EUR'));
return (string) config('firefly.default_currency', 'EUR'); return (string)config('firefly.default_currency', 'EUR');
} }
/** /**
@ -165,7 +166,7 @@ class Amount
$currencyPrefStr = $currencyPreference ? $currencyPreference->data : 'EUR'; $currencyPrefStr = $currencyPreference ? $currencyPreference->data : 'EUR';
// at this point the currency preference could be encrypted, if coming from an old version. // at this point the currency preference could be encrypted, if coming from an old version.
$currencyCode = $this->tryDecrypt((string) $currencyPrefStr); $currencyCode = $this->tryDecrypt((string)$currencyPrefStr);
// could still be json encoded: // could still be json encoded:
/** @var TransactionCurrency|null $currency */ /** @var TransactionCurrency|null $currency */
@ -324,11 +325,11 @@ class Amount
} }
// default is amount before currency // default is amount before currency
$format = $posA . $posD . '%v' . $space . $posB . '%s' . $posC . $posE; $format = $posA.$posD.'%v'.$space.$posB.'%s'.$posC.$posE;
if ($csPrecedes) { if ($csPrecedes) {
// alternative is currency before amount // alternative is currency before amount
$format = $posA . $posB . '%s' . $posC . $space . $posD . '%v' . $posE; $format = $posA.$posB.'%s'.$posC.$space.$posD.'%v'.$posE;
} }
return $format; return $format;

View File

@ -105,8 +105,8 @@ class WholePeriodChartGenerator
$earnedInfoKey = sprintf('earned-in-%s', $code); $earnedInfoKey = sprintf('earned-in-%s', $code);
$spentAmount = $spent[$key][$currencyId]['sum'] ?? '0'; $spentAmount = $spent[$key][$currencyId]['sum'] ?? '0';
$earnedAmount = $earned[$key][$currencyId]['sum'] ?? '0'; $earnedAmount = $earned[$key][$currencyId]['sum'] ?? '0';
$chartData[$spentInfoKey]['entries'][$label] = round((float) $spentAmount, $currency['currency_decimal_places']); $chartData[$spentInfoKey]['entries'][$label] = app('steam')->bcround($spentAmount, $currency['currency_decimal_places']);
$chartData[$earnedInfoKey]['entries'][$label] = round((float) $earnedAmount, $currency['currency_decimal_places']); $chartData[$earnedInfoKey]['entries'][$label] = app('steam')->bcround($earnedAmount, $currency['currency_decimal_places']);
} }
$current = app('navigation')->addPeriod($current, $step, 0); $current = app('navigation')->addPeriod($current, $step, 0);
} }

View File

@ -93,7 +93,7 @@ class CurrencyForm
// make sure value is formatted nicely: // make sure value is formatted nicely:
if (null !== $value && '' !== $value) { if (null !== $value && '' !== $value) {
$value = round((float) $value, $defaultCurrency->decimal_places); $value = app('steam')->bcround($value, $defaultCurrency->decimal_places);
} }
try { try {
$html = view('form.' . $view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render(); $html = view('form.' . $view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render();
@ -163,7 +163,7 @@ class CurrencyForm
// make sure value is formatted nicely: // make sure value is formatted nicely:
if (null !== $value && '' !== $value) { if (null !== $value && '' !== $value) {
$value = round((float) $value, $defaultCurrency->decimal_places); $value = app('steam')->bcround($value, $defaultCurrency->decimal_places);
} }
try { try {
$html = view('form.' . $view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render(); $html = view('form.' . $view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render();

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Steam.php * Steam.php
* Copyright (c) 2019 james@firefly-iii.org * Copyright (c) 2019 james@firefly-iii.org
@ -55,7 +56,7 @@ class Steam
$repository = app(AccountRepositoryInterface::class); $repository = app(AccountRepositoryInterface::class);
$repository->setUser($account->user); $repository->setUser($account->user);
$currencyId = (int) $repository->getMetaValue($account, 'currency_id'); $currencyId = (int)$repository->getMetaValue($account, 'currency_id');
$transactions = $account->transactions() $transactions = $account->transactions()
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
->where('transaction_journals.date', '<=', $date->format('Y-m-d 23:59:59')) ->where('transaction_journals.date', '<=', $date->format('Y-m-d 23:59:59'))
@ -86,7 +87,7 @@ class Steam
$sum = '0'; $sum = '0';
/** @var array $transaction */ /** @var array $transaction */
foreach ($transactions as $transaction) { foreach ($transactions as $transaction) {
$value = (string) ($transaction[$key] ?? '0'); $value = (string)($transaction[$key] ?? '0');
$value = '' === $value ? '0' : $value; $value = '' === $value ? '0' : $value;
$sum = bcadd($sum, $value); $sum = bcadd($sum, $value);
} }
@ -94,6 +95,26 @@ class Steam
return $sum; return $sum;
} }
/**
* https://stackoverflow.com/questions/1642614/how-to-ceil-floor-and-round-bcmath-numbers
*
* @param string $number
* @param int $precision
* @return string
*/
public function bcround(string $number, int $precision = 0): string
{
if (str_contains($number, '.')) {
if ($number[0] !== '-') {
return bcadd($number, '0.'.str_repeat('0', $precision).'5', $precision);
}
return bcsub($number, '0.'.str_repeat('0', $precision).'5', $precision);
}
return $number;
}
/** /**
* Gets the balance for the given account during the whole range, using this format:. * Gets the balance for the given account during the whole range, using this format:.
* *
@ -133,7 +154,7 @@ class Steam
$repository->setUser($account->user); $repository->setUser($account->user);
$currency = $repository->getAccountCurrency($account) ?? app('amount')->getDefaultCurrencyByUser($account->user); $currency = $repository->getAccountCurrency($account) ?? app('amount')->getDefaultCurrencyByUser($account->user);
} }
$currencyId = (int) $currency->id; $currencyId = (int)$currency->id;
$start->addDay(); $start->addDay();
@ -161,14 +182,14 @@ class Steam
/** @var Transaction $entry */ /** @var Transaction $entry */
foreach ($set as $entry) { foreach ($set as $entry) {
// normal amount and foreign amount // normal amount and foreign amount
$modified = null === $entry->modified ? '0' : (string) $entry->modified; $modified = null === $entry->modified ? '0' : (string)$entry->modified;
$foreignModified = null === $entry->modified_foreign ? '0' : (string) $entry->modified_foreign; $foreignModified = null === $entry->modified_foreign ? '0' : (string)$entry->modified_foreign;
$amount = '0'; $amount = '0';
if ($currencyId === (int) $entry->transaction_currency_id || 0 === $currencyId) { if ($currencyId === (int)$entry->transaction_currency_id || 0 === $currencyId) {
// use normal amount: // use normal amount:
$amount = $modified; $amount = $modified;
} }
if ($currencyId === (int) $entry->foreign_currency_id) { if ($currencyId === (int)$entry->foreign_currency_id) {
// use foreign amount: // use foreign amount:
$amount = $foreignModified; $amount = $foreignModified;
} }
@ -226,7 +247,7 @@ class Steam
->get(['transactions.foreign_amount'])->toArray(); ->get(['transactions.foreign_amount'])->toArray();
$foreignBalance = $this->sumTransactions($transactions, 'foreign_amount'); $foreignBalance = $this->sumTransactions($transactions, 'foreign_amount');
$balance = bcadd($nativeBalance, $foreignBalance); $balance = bcadd($nativeBalance, $foreignBalance);
$virtual = null === $account->virtual_balance ? '0' : (string) $account->virtual_balance; $virtual = null === $account->virtual_balance ? '0' : (string)$account->virtual_balance;
$balance = bcadd($balance, $virtual); $balance = bcadd($balance, $virtual);
$cache->store($balance); $cache->store($balance);
@ -323,7 +344,7 @@ class Steam
$return = []; $return = [];
/** @var stdClass $entry */ /** @var stdClass $entry */
foreach ($balances as $entry) { foreach ($balances as $entry) {
$return[(int) $entry->transaction_currency_id] = (string) $entry->sum_for_currency; $return[(int)$entry->transaction_currency_id] = (string)$entry->sum_for_currency;
} }
$cache->store($return); $cache->store($return);
@ -409,7 +430,7 @@ class Steam
foreach ($set as $entry) { foreach ($set as $entry) {
$date = new Carbon($entry->max_date, config('app.timezone')); $date = new Carbon($entry->max_date, config('app.timezone'));
$date->setTimezone(config('app.timezone')); $date->setTimezone(config('app.timezone'));
$list[(int) $entry->account_id] = $date; $list[(int)$entry->account_id] = $date;
} }
return $list; return $list;
@ -554,11 +575,11 @@ class Steam
$post = strlen(substr($number, strpos($number, '.') + 1)); $post = strlen(substr($number, strpos($number, '.') + 1));
$mantis = substr($value, strpos($value, 'E') + 1); $mantis = substr($value, strpos($value, 'E') + 1);
if ($mantis < 0) { if ($mantis < 0) {
$post += abs((int) $mantis); $post += abs((int)$mantis);
} }
return number_format((float) $value, $post, '.', ''); return number_format((float)$value, $post, '.', '');
} }
return number_format((float) $value, 0, '.', ''); return number_format((float)$value, 0, '.', '');
} }
/** /**
@ -588,24 +609,24 @@ class Steam
// has a K in it, remove the K and multiply by 1024. // has a K in it, remove the K and multiply by 1024.
$bytes = bcmul(rtrim($string, 'k'), '1024'); $bytes = bcmul(rtrim($string, 'k'), '1024');
return (int) $bytes; return (int)$bytes;
} }
if (false !== stripos($string, 'm')) { if (false !== stripos($string, 'm')) {
// has a M in it, remove the M and multiply by 1048576. // has a M in it, remove the M and multiply by 1048576.
$bytes = bcmul(rtrim($string, 'm'), '1048576'); $bytes = bcmul(rtrim($string, 'm'), '1048576');
return (int) $bytes; return (int)$bytes;
} }
if (false !== stripos($string, 'g')) { if (false !== stripos($string, 'g')) {
// has a G in it, remove the G and multiply by (1024)^3. // has a G in it, remove the G and multiply by (1024)^3.
$bytes = bcmul(rtrim($string, 'g'), '1073741824'); $bytes = bcmul(rtrim($string, 'g'), '1073741824');
return (int) $bytes; return (int)$bytes;
} }
return (int) $string; return (int)$string;
} }
/** /**

157
composer.lock generated
View File

@ -470,16 +470,16 @@
}, },
{ {
"name": "doctrine/dbal", "name": "doctrine/dbal",
"version": "3.5.1", "version": "3.5.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/dbal.git", "url": "https://github.com/doctrine/dbal.git",
"reference": "f38ee8aaca2d58ee88653cb34a6a3880c23f38a5" "reference": "63e513cebbbaf96a6795e5c5ee34d205831bfc85"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/f38ee8aaca2d58ee88653cb34a6a3880c23f38a5", "url": "https://api.github.com/repos/doctrine/dbal/zipball/63e513cebbbaf96a6795e5c5ee34d205831bfc85",
"reference": "f38ee8aaca2d58ee88653cb34a6a3880c23f38a5", "reference": "63e513cebbbaf96a6795e5c5ee34d205831bfc85",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -492,16 +492,16 @@
"psr/log": "^1|^2|^3" "psr/log": "^1|^2|^3"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "10.0.0", "doctrine/coding-standard": "11.0.0",
"jetbrains/phpstorm-stubs": "2022.2", "jetbrains/phpstorm-stubs": "2022.3",
"phpstan/phpstan": "1.8.10", "phpstan/phpstan": "1.9.2",
"phpstan/phpstan-strict-rules": "^1.4", "phpstan/phpstan-strict-rules": "^1.4",
"phpunit/phpunit": "9.5.25", "phpunit/phpunit": "9.5.27",
"psalm/plugin-phpunit": "0.17.0", "psalm/plugin-phpunit": "0.18.4",
"squizlabs/php_codesniffer": "3.7.1", "squizlabs/php_codesniffer": "3.7.1",
"symfony/cache": "^5.4|^6.0", "symfony/cache": "^5.4|^6.0",
"symfony/console": "^4.4|^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0",
"vimeo/psalm": "4.29.0" "vimeo/psalm": "4.30.0"
}, },
"suggest": { "suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files." "symfony/console": "For helpful console commands such as SQL execution and import of files."
@ -561,7 +561,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/dbal/issues", "issues": "https://github.com/doctrine/dbal/issues",
"source": "https://github.com/doctrine/dbal/tree/3.5.1" "source": "https://github.com/doctrine/dbal/tree/3.5.2"
}, },
"funding": [ "funding": [
{ {
@ -577,7 +577,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-10-24T07:26:18+00:00" "time": "2022-12-19T08:17:34+00:00"
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
@ -1135,16 +1135,16 @@
}, },
{ {
"name": "firebase/php-jwt", "name": "firebase/php-jwt",
"version": "v6.3.1", "version": "v6.3.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/firebase/php-jwt.git", "url": "https://github.com/firebase/php-jwt.git",
"reference": "ddfaddcb520488b42bca3a75e17e9dd53c3667da" "reference": "ea7dda77098b96e666c5ef382452f94841e439cd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/ddfaddcb520488b42bca3a75e17e9dd53c3667da", "url": "https://api.github.com/repos/firebase/php-jwt/zipball/ea7dda77098b96e666c5ef382452f94841e439cd",
"reference": "ddfaddcb520488b42bca3a75e17e9dd53c3667da", "reference": "ea7dda77098b96e666c5ef382452f94841e439cd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1191,9 +1191,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/firebase/php-jwt/issues", "issues": "https://github.com/firebase/php-jwt/issues",
"source": "https://github.com/firebase/php-jwt/tree/v6.3.1" "source": "https://github.com/firebase/php-jwt/tree/v6.3.2"
}, },
"time": "2022-11-01T21:20:08+00:00" "time": "2022-12-19T17:10:46+00:00"
}, },
{ {
"name": "fruitcake/php-cors", "name": "fruitcake/php-cors",
@ -1855,16 +1855,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v9.43.0", "version": "v9.45.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "011f2e1d49a11c22519a7899b46ddf3bc5b0f40b" "reference": "faeb20d3fc61b69790068161ab42bcf2d5faccbc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/011f2e1d49a11c22519a7899b46ddf3bc5b0f40b", "url": "https://api.github.com/repos/laravel/framework/zipball/faeb20d3fc61b69790068161ab42bcf2d5faccbc",
"reference": "011f2e1d49a11c22519a7899b46ddf3bc5b0f40b", "reference": "faeb20d3fc61b69790068161ab42bcf2d5faccbc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1875,7 +1875,7 @@
"ext-openssl": "*", "ext-openssl": "*",
"fruitcake/php-cors": "^1.2", "fruitcake/php-cors": "^1.2",
"laravel/serializable-closure": "^1.2.2", "laravel/serializable-closure": "^1.2.2",
"league/commonmark": "^2.2", "league/commonmark": "^2.2.1",
"league/flysystem": "^3.8.0", "league/flysystem": "^3.8.0",
"monolog/monolog": "^2.0", "monolog/monolog": "^2.0",
"nesbot/carbon": "^2.62.1", "nesbot/carbon": "^2.62.1",
@ -1884,7 +1884,7 @@
"psr/container": "^1.1.1|^2.0.1", "psr/container": "^1.1.1|^2.0.1",
"psr/log": "^1.0|^2.0|^3.0", "psr/log": "^1.0|^2.0|^3.0",
"psr/simple-cache": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0",
"ramsey/uuid": "^4.2.2", "ramsey/uuid": "^4.7",
"symfony/console": "^6.0.9", "symfony/console": "^6.0.9",
"symfony/error-handler": "^6.0", "symfony/error-handler": "^6.0",
"symfony/finder": "^6.0", "symfony/finder": "^6.0",
@ -1945,7 +1945,7 @@
"ably/ably-php": "^1.0", "ably/ably-php": "^1.0",
"aws/aws-sdk-php": "^3.235.5", "aws/aws-sdk-php": "^3.235.5",
"doctrine/dbal": "^2.13.3|^3.1.4", "doctrine/dbal": "^2.13.3|^3.1.4",
"fakerphp/faker": "^1.9.2", "fakerphp/faker": "^1.21",
"guzzlehttp/guzzle": "^7.5", "guzzlehttp/guzzle": "^7.5",
"league/flysystem-aws-s3-v3": "^3.0", "league/flysystem-aws-s3-v3": "^3.0",
"league/flysystem-ftp": "^3.0", "league/flysystem-ftp": "^3.0",
@ -1953,7 +1953,7 @@
"league/flysystem-read-only": "^3.3", "league/flysystem-read-only": "^3.3",
"league/flysystem-sftp-v3": "^3.0", "league/flysystem-sftp-v3": "^3.0",
"mockery/mockery": "^1.5.1", "mockery/mockery": "^1.5.1",
"orchestra/testbench-core": "^7.11", "orchestra/testbench-core": "^7.16",
"pda/pheanstalk": "^4.0", "pda/pheanstalk": "^4.0",
"phpstan/phpstan": "^1.4.7", "phpstan/phpstan": "^1.4.7",
"phpunit/phpunit": "^9.5.8", "phpunit/phpunit": "^9.5.8",
@ -2037,7 +2037,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2022-12-06T14:26:07+00:00" "time": "2022-12-21T19:37:46+00:00"
}, },
{ {
"name": "laravel/passport", "name": "laravel/passport",
@ -2678,16 +2678,16 @@
}, },
{ {
"name": "league/config", "name": "league/config",
"version": "v1.1.1", "version": "v1.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/config.git", "url": "https://github.com/thephpleague/config.git",
"reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
"reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2696,7 +2696,7 @@
"php": "^7.4 || ^8.0" "php": "^7.4 || ^8.0"
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "^0.12.90", "phpstan/phpstan": "^1.8.2",
"phpunit/phpunit": "^9.5.5", "phpunit/phpunit": "^9.5.5",
"scrutinizer/ocular": "^1.8.1", "scrutinizer/ocular": "^1.8.1",
"unleashedtech/php-coding-standard": "^3.1", "unleashedtech/php-coding-standard": "^3.1",
@ -2756,7 +2756,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2021-08-14T12:15:32+00:00" "time": "2022-12-11T20:36:23+00:00"
}, },
{ {
"name": "league/csv", "name": "league/csv",
@ -2898,16 +2898,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "3.11.0", "version": "3.12.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "7e423e5dd240a60adfab9bde058d7668863b7731" "reference": "2aef65a47e44f2d6f9938f720f6dd697e7ba7b76"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7e423e5dd240a60adfab9bde058d7668863b7731", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2aef65a47e44f2d6f9938f720f6dd697e7ba7b76",
"reference": "7e423e5dd240a60adfab9bde058d7668863b7731", "reference": "2aef65a47e44f2d6f9938f720f6dd697e7ba7b76",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2969,7 +2969,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem/issues", "issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.11.0" "source": "https://github.com/thephpleague/flysystem/tree/3.12.0"
}, },
"funding": [ "funding": [
{ {
@ -2985,7 +2985,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-12-02T14:39:57+00:00" "time": "2022-12-20T20:21:10+00:00"
}, },
{ {
"name": "league/fractal", "name": "league/fractal",
@ -3725,16 +3725,16 @@
}, },
{ {
"name": "nunomaduro/collision", "name": "nunomaduro/collision",
"version": "v6.3.1", "version": "v6.3.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nunomaduro/collision.git", "url": "https://github.com/nunomaduro/collision.git",
"reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b" "reference": "83699b231e7f277bfa2e823788973bf4082f019a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nunomaduro/collision/zipball/0f6349c3ed5dd28467087b08fb59384bb458a22b", "url": "https://api.github.com/repos/nunomaduro/collision/zipball/83699b231e7f277bfa2e823788973bf4082f019a",
"reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b", "reference": "83699b231e7f277bfa2e823788973bf4082f019a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3809,20 +3809,20 @@
"type": "patreon" "type": "patreon"
} }
], ],
"time": "2022-09-29T12:29:49+00:00" "time": "2022-12-23T21:36:49+00:00"
}, },
{ {
"name": "nunomaduro/termwind", "name": "nunomaduro/termwind",
"version": "v1.14.2", "version": "v1.15.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nunomaduro/termwind.git", "url": "https://github.com/nunomaduro/termwind.git",
"reference": "9a8218511eb1a0965629ff820dda25985440aefc" "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nunomaduro/termwind/zipball/9a8218511eb1a0965629ff820dda25985440aefc", "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/594ab862396c16ead000de0c3c38f4a5cbe1938d",
"reference": "9a8218511eb1a0965629ff820dda25985440aefc", "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3879,7 +3879,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/nunomaduro/termwind/issues", "issues": "https://github.com/nunomaduro/termwind/issues",
"source": "https://github.com/nunomaduro/termwind/tree/v1.14.2" "source": "https://github.com/nunomaduro/termwind/tree/v1.15.0"
}, },
"funding": [ "funding": [
{ {
@ -3895,7 +3895,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-10-28T22:51:32+00:00" "time": "2022-12-20T19:00:15+00:00"
}, },
{ {
"name": "nyholm/psr7", "name": "nyholm/psr7",
@ -4222,16 +4222,16 @@
}, },
{ {
"name": "phpseclib/phpseclib", "name": "phpseclib/phpseclib",
"version": "3.0.17", "version": "3.0.18",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpseclib/phpseclib.git", "url": "https://github.com/phpseclib/phpseclib.git",
"reference": "dbc2307d5c69aeb22db136c52e91130d7f2ca761" "reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/dbc2307d5c69aeb22db136c52e91130d7f2ca761", "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f28693d38ba21bb0d9f0c411ee5dae2b178201da",
"reference": "dbc2307d5c69aeb22db136c52e91130d7f2ca761", "reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4312,7 +4312,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/phpseclib/phpseclib/issues", "issues": "https://github.com/phpseclib/phpseclib/issues",
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.17" "source": "https://github.com/phpseclib/phpseclib/tree/3.0.18"
}, },
"funding": [ "funding": [
{ {
@ -4328,7 +4328,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-10-24T10:51:50+00:00" "time": "2022-12-17T18:26:50+00:00"
}, },
{ {
"name": "pragmarx/google2fa", "name": "pragmarx/google2fa",
@ -5168,23 +5168,23 @@
}, },
{ {
"name": "ramsey/uuid", "name": "ramsey/uuid",
"version": "4.6.0", "version": "4.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ramsey/uuid.git", "url": "https://github.com/ramsey/uuid.git",
"reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f" "reference": "5ed9ad582647bbc3864ef78db34bdc1afdcf9b49"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/ad63bc700e7d021039e30ce464eba384c4a1d40f", "url": "https://api.github.com/repos/ramsey/uuid/zipball/5ed9ad582647bbc3864ef78db34bdc1afdcf9b49",
"reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f", "reference": "5ed9ad582647bbc3864ef78db34bdc1afdcf9b49",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"brick/math": "^0.8.8 || ^0.9 || ^0.10", "brick/math": "^0.8.8 || ^0.9 || ^0.10",
"ext-json": "*", "ext-json": "*",
"php": "^8.0", "php": "^8.0",
"ramsey/collection": "^1.0" "ramsey/collection": "^1.2"
}, },
"replace": { "replace": {
"rhumsaa/uuid": "self.version" "rhumsaa/uuid": "self.version"
@ -5244,7 +5244,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/ramsey/uuid/issues", "issues": "https://github.com/ramsey/uuid/issues",
"source": "https://github.com/ramsey/uuid/tree/4.6.0" "source": "https://github.com/ramsey/uuid/tree/4.7.0"
}, },
"funding": [ "funding": [
{ {
@ -5256,7 +5256,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-11-05T23:03:38+00:00" "time": "2022-12-19T22:30:49+00:00"
}, },
{ {
"name": "rcrowe/twigbridge", "name": "rcrowe/twigbridge",
@ -9048,20 +9048,20 @@
}, },
{ {
"name": "fakerphp/faker", "name": "fakerphp/faker",
"version": "v1.20.0", "version": "v1.21.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/FakerPHP/Faker.git", "url": "https://github.com/FakerPHP/Faker.git",
"reference": "37f751c67a5372d4e26353bd9384bc03744ec77b" "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/FakerPHP/Faker/zipball/37f751c67a5372d4e26353bd9384bc03744ec77b", "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d",
"reference": "37f751c67a5372d4e26353bd9384bc03744ec77b", "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1 || ^8.0", "php": "^7.4 || ^8.0",
"psr/container": "^1.0 || ^2.0", "psr/container": "^1.0 || ^2.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0" "symfony/deprecation-contracts": "^2.2 || ^3.0"
}, },
@ -9072,7 +9072,8 @@
"bamarni/composer-bin-plugin": "^1.4.1", "bamarni/composer-bin-plugin": "^1.4.1",
"doctrine/persistence": "^1.3 || ^2.0", "doctrine/persistence": "^1.3 || ^2.0",
"ext-intl": "*", "ext-intl": "*",
"symfony/phpunit-bridge": "^4.4 || ^5.2" "phpunit/phpunit": "^9.5.26",
"symfony/phpunit-bridge": "^5.4.16"
}, },
"suggest": { "suggest": {
"doctrine/orm": "Required to use Faker\\ORM\\Doctrine", "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
@ -9084,7 +9085,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "v1.20-dev" "dev-main": "v1.21-dev"
} }
}, },
"autoload": { "autoload": {
@ -9109,9 +9110,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/FakerPHP/Faker/issues", "issues": "https://github.com/FakerPHP/Faker/issues",
"source": "https://github.com/FakerPHP/Faker/tree/v1.20.0" "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0"
}, },
"time": "2022-07-20T13:12:54+00:00" "time": "2022-12-13T13:54:32+00:00"
}, },
{ {
"name": "hamcrest/hamcrest-php", "name": "hamcrest/hamcrest-php",
@ -9899,16 +9900,16 @@
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.19", "version": "9.2.22",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e4bf60d2220b4baaa0572986b5d69870226b06df",
"reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9964,7 +9965,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.22"
}, },
"funding": [ "funding": [
{ {
@ -9972,7 +9973,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-11-18T07:47:47+00:00" "time": "2022-12-18T16:40:55+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",

63
config/passport.php Normal file
View File

@ -0,0 +1,63 @@
<?php
declare(strict_types=1);
return [
/*
|--------------------------------------------------------------------------
| Passport Guard
|--------------------------------------------------------------------------
|
| Here you may specify which authentication guard Passport will use when
| authenticating users. This value should correspond with one of your
| guards that is already present in your "auth" configuration file.
|
*/
'guard' => envNonEmpty('AUTHENTICATION_GUARD', 'web'),
/*
|--------------------------------------------------------------------------
| Encryption Keys
|--------------------------------------------------------------------------
|
| Passport uses encryption keys while generating secure access tokens for
| your application. By default, the keys are stored as local files but
| can be set via environment variables when that is more convenient.
|
*/
'private_key' => env('PASSPORT_PRIVATE_KEY'),
'public_key' => env('PASSPORT_PUBLIC_KEY'),
/*
|--------------------------------------------------------------------------
| Client UUIDs
|--------------------------------------------------------------------------
|
| By default, Passport uses auto-incrementing primary keys when assigning
| IDs to clients. However, if Passport is installed using the provided
| --uuids switch, this will be set to "true" and UUIDs will be used.
|
*/
'client_uuids' => false,
/*
|--------------------------------------------------------------------------
| Personal Access Client
|--------------------------------------------------------------------------
|
| If you enable client hashing, you should set the personal access client
| ID and unhashed secret within your environment file. The values will
| get used while issuing fresh personal access tokens to your users.
|
*/
'personal_access_client' => [
'id' => env('PASSPORT_PERSONAL_ACCESS_CLIENT_ID'),
'secret' => env('PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET'),
],
];

View File

@ -3290,9 +3290,9 @@ jest-worker@^27.4.5:
supports-color "^8.0.0" supports-color "^8.0.0"
jquery@^3: jquery@^3:
version "3.6.1" version "3.6.2"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.1.tgz#fab0408f8b45fc19f956205773b62b292c147a16" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.2.tgz#8302bbc9160646f507bdf59d136a478b312783c4"
integrity sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw== integrity sha512-/e7ulNIEEYk1Z/l4X0vpxGt+B/dNsV8ghOPAWZaJs8pkGvsSC0tm33aMGylXcj/U7y4IcvwtMXPMyBFZn/gK9A==
js-tokens@^4.0.0: js-tokens@^4.0.0:
version "4.0.0" version "4.0.0"
@ -4247,9 +4247,9 @@ postcss@^7.0.36:
source-map "^0.6.1" source-map "^0.6.1"
postcss@^8.1.10, postcss@^8.2.15, postcss@^8.4, postcss@^8.4.14: postcss@^8.1.10, postcss@^8.2.15, postcss@^8.4, postcss@^8.4.14:
version "8.4.19" version "8.4.20"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56"
integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==
dependencies: dependencies:
nanoid "^3.3.4" nanoid "^3.3.4"
picocolors "^1.0.0" picocolors "^1.0.0"