This commit is contained in:
James Cole
2025-06-07 06:31:14 +02:00
parent 51e58f8d88
commit da0a07262c
4 changed files with 47 additions and 40 deletions

View File

@@ -78,7 +78,7 @@ class PiggyBankFactory
unset($piggyBankData['object_group_title'], $piggyBankData['transaction_currency_code'], $piggyBankData['transaction_currency_id'], $piggyBankData['accounts'], $piggyBankData['object_group_id'], $piggyBankData['notes']); unset($piggyBankData['object_group_title'], $piggyBankData['transaction_currency_code'], $piggyBankData['transaction_currency_id'], $piggyBankData['accounts'], $piggyBankData['object_group_id'], $piggyBankData['notes']);
// validate amount: // validate amount:
if (array_key_exists('target_amount', $piggyBankData) && '' === (string) $piggyBankData['target_amount']) { if (array_key_exists('target_amount', $piggyBankData) && '' === (string)$piggyBankData['target_amount']) {
$piggyBankData['target_amount'] = '0'; $piggyBankData['target_amount'] = '0';
} }
@@ -108,7 +108,7 @@ class PiggyBankFactory
} }
} }
// try also with ID // try also with ID
$objectGroupId = (int) ($data['object_group_id'] ?? 0); $objectGroupId = (int)($data['object_group_id'] ?? 0);
if (0 !== $objectGroupId) { if (0 !== $objectGroupId) {
$objectGroup = $this->findObjectGroupById($objectGroupId); $objectGroup = $this->findObjectGroupById($objectGroupId);
if ($objectGroup instanceof ObjectGroup) { if ($objectGroup instanceof ObjectGroup) {
@@ -129,10 +129,10 @@ class PiggyBankFactory
$defaultCurrency = app('amount')->getNativeCurrency(); $defaultCurrency = app('amount')->getNativeCurrency();
$currency = null; $currency = null;
if (array_key_exists('transaction_currency_code', $data)) { if (array_key_exists('transaction_currency_code', $data)) {
$currency = $this->currencyRepository->findByCode((string) ($data['transaction_currency_code'] ?? '')); $currency = $this->currencyRepository->findByCode((string)($data['transaction_currency_code'] ?? ''));
} }
if (array_key_exists('transaction_currency_id', $data)) { if (array_key_exists('transaction_currency_id', $data)) {
$currency = $this->currencyRepository->find((int) ($data['transaction_currency_id'] ?? 0)); $currency = $this->currencyRepository->find((int)($data['transaction_currency_id'] ?? 0));
} }
$currency ??= $defaultCurrency; $currency ??= $defaultCurrency;
@@ -141,8 +141,8 @@ class PiggyBankFactory
public function find(?int $piggyBankId, ?string $piggyBankName): ?PiggyBank public function find(?int $piggyBankId, ?string $piggyBankName): ?PiggyBank
{ {
$piggyBankId = (int) $piggyBankId; $piggyBankId = (int)$piggyBankId;
$piggyBankName = (string) $piggyBankName; $piggyBankName = (string)$piggyBankName;
if ('' === $piggyBankName && 0 === $piggyBankId) { if ('' === $piggyBankName && 0 === $piggyBankId) {
return null; return null;
} }
@@ -152,8 +152,7 @@ class PiggyBankFactory
->leftJoin('accounts', 'accounts.id', '=', 'account_piggy_bank.account_id') ->leftJoin('accounts', 'accounts.id', '=', 'account_piggy_bank.account_id')
->where('accounts.user_id', $this->user->id) ->where('accounts.user_id', $this->user->id)
->where('piggy_banks.id', $piggyBankId) ->where('piggy_banks.id', $piggyBankId)
->first(['piggy_banks.*']) ->first(['piggy_banks.*']);
;
if (null !== $piggyBank) { if (null !== $piggyBank) {
return $piggyBank; return $piggyBank;
} }
@@ -177,8 +176,7 @@ class PiggyBankFactory
->leftJoin('accounts', 'accounts.id', '=', 'account_piggy_bank.account_id') ->leftJoin('accounts', 'accounts.id', '=', 'account_piggy_bank.account_id')
->where('accounts.user_id', $this->user->id) ->where('accounts.user_id', $this->user->id)
->where('piggy_banks.name', $name) ->where('piggy_banks.name', $name)
->first(['piggy_banks.*']) ->first(['piggy_banks.*']);
;
} }
private function setOrder(PiggyBank $piggyBank, array $data): PiggyBank private function setOrder(PiggyBank $piggyBank, array $data): PiggyBank
@@ -206,8 +204,7 @@ class PiggyBankFactory
'objectGroups', 'objectGroups',
] ]
) )
->orderBy('piggy_banks.order', 'ASC')->get(['piggy_banks.*']) ->orderBy('piggy_banks.order', 'ASC')->get(['piggy_banks.*']);
;
$current = 1; $current = 1;
foreach ($set as $piggyBank) { foreach ($set as $piggyBank) {
if ($piggyBank->order !== $current) { if ($piggyBank->order !== $current) {
@@ -221,7 +218,7 @@ class PiggyBankFactory
private function getMaxOrder(): int private function getMaxOrder(): int
{ {
return (int) $this->piggyBankRepository->getPiggyBanks()->max('order'); return (int)$this->piggyBankRepository->getPiggyBanks()->max('order');
} }
@@ -231,11 +228,12 @@ class PiggyBankFactory
// collect current current_amount so the sync does not remove them. // collect current current_amount so the sync does not remove them.
// TODO this is a tedious check. Feels like a hack. // TODO this is a tedious check. Feels like a hack.
$toBeLinked = []; $toBeLinked = [];
$oldSavedAmount = $this->piggyBankRepository->getCurrentAmount($piggyBank);
foreach ($piggyBank->accounts as $account) { foreach ($piggyBank->accounts as $account) {
Log::debug(sprintf('Checking account #%d', $account->id)); Log::debug(sprintf('Checking account #%d', $account->id));
foreach ($accounts as $info) { foreach ($accounts as $info) {
Log::debug(sprintf(' Checking other account #%d', $info['account_id'])); Log::debug(sprintf(' Checking other account #%d', $info['account_id']));
if ((int) $account->id === (int) $info['account_id']) { if ((int)$account->id === (int)$info['account_id']) {
$toBeLinked[$account->id] = ['current_amount' => $account->pivot->current_amount ?? '0']; $toBeLinked[$account->id] = ['current_amount' => $account->pivot->current_amount ?? '0'];
Log::debug(sprintf('Prefilled for account #%d with amount %s', $account->id, $account->pivot->current_amount ?? '0')); Log::debug(sprintf('Prefilled for account #%d with amount %s', $account->id, $account->pivot->current_amount ?? '0'));
} }
@@ -244,9 +242,9 @@ class PiggyBankFactory
/** @var array $info */ /** @var array $info */
foreach ($accounts as $info) { foreach ($accounts as $info) {
$account = $this->accountRepository->find((int) ($info['account_id'] ?? 0)); $account = $this->accountRepository->find((int)($info['account_id'] ?? 0));
if (!$account instanceof Account) { if (!$account instanceof Account) {
Log::debug(sprintf('Account #%d not found, skipping.', (int) ($info['account_id'] ?? 0))); Log::debug(sprintf('Account #%d not found, skipping.', (int)($info['account_id'] ?? 0)));
continue; continue;
} }
@@ -290,7 +288,16 @@ class PiggyBankFactory
} }
Log::debug(sprintf('Link information: %s', json_encode($toBeLinked))); Log::debug(sprintf('Link information: %s', json_encode($toBeLinked)));
if (0 !== count($toBeLinked)) { if (0 !== count($toBeLinked)) {
Log::debug('Syncing accounts to piggy bank.');
$piggyBank->accounts()->sync($toBeLinked); $piggyBank->accounts()->sync($toBeLinked);
$piggyBank->refresh();
$newSavedAmount = $this->piggyBankRepository->getCurrentAmount($piggyBank);
Log::debug(sprintf('Old saved amount: %s, new saved amount is %s', $oldSavedAmount, $newSavedAmount));
if (0 !== bccomp($oldSavedAmount, $newSavedAmount)) {
Log::debug('Amount changed, will create event for it.');
// create event for difference.
event(new ChangedAmount($piggyBank, bcsub($newSavedAmount, $oldSavedAmount), null, null));
}
} }
if (0 === count($toBeLinked)) { if (0 === count($toBeLinked)) {
Log::warning('No accounts to link to piggy bank, will not change whatever is there now.'); Log::warning('No accounts to link to piggy bank, will not change whatever is there now.');

View File

@@ -276,7 +276,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface, UserGroupInte
$amount = '' === $amount ? '0' : $amount; $amount = '' === $amount ? '0' : $amount;
$sum = bcadd($sum, $amount); $sum = bcadd($sum, $amount);
} }
// Log::debug(sprintf('Current amount in piggy bank #%d ("%s") is %s', $piggyBank->id, $piggyBank->name, $sum)); Log::debug(sprintf('Current amount in piggy bank #%d ("%s") is %s', $piggyBank->id, $piggyBank->name, $sum));
return $sum; return $sum;
} }

View File

@@ -73,8 +73,8 @@ class PiggyBankEventTransformer extends AbstractTransformer
return [ return [
'id' => (string) $event->id, 'id' => (string) $event->id,
'created_at' => $event->created_at->toAtomString(), 'created_at' => $event->created_at?->toAtomString(),
'updated_at' => $event->updated_at->toAtomString(), 'updated_at' => $event->updated_at?->toAtomString(),
'amount' => app('steam')->bcround($event->amount, $currency->decimal_places), 'amount' => app('steam')->bcround($event->amount, $currency->decimal_places),
'currency_id' => (string) $currency->id, 'currency_id' => (string) $currency->id,
'currency_code' => $currency->code, 'currency_code' => $currency->code,

View File

@@ -2,7 +2,7 @@
<label for="{{ options.id }}" class="col-sm-4 control-label">{{ label }}</label> <label for="{{ options.id }}" class="col-sm-4 control-label">{{ label }}</label>
<div class="col-sm-8"> <div class="col-sm-8">
{{ Html.multiselect(name~"[]", list, selected).id(options.id).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder', options.placeholder) }} {{ Html.multiselect(name~"[]", list, selected).id(options.id).attribute('size',12).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder', options.placeholder) }}
{% include 'form.help' %} {% include 'form.help' %}
{% include 'form.feedback' %} {% include 'form.feedback' %}