From a69b6d9ce2409b16df7d3f2ed7b1d45001185221 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 27 Jul 2025 20:45:08 +0200 Subject: [PATCH] Respond to "convert to native". --- .../Controllers/Chart/AccountController.php | 1 + .../Models/Transaction/ShowController.php | 1 + app/Helpers/Collector/GroupCollector.php | 1 - .../TransactionGroupTransformer.php | 9 ++++++ .../v2/src/api/v1/chart/account/dashboard.js | 2 +- .../assets/v2/src/pages/dashboard/accounts.js | 30 +++++++------------ .../assets/v2/src/pages/dashboard/boxes.js | 12 +++++++- .../assets/v2/src/pages/dashboard/sankey.js | 10 ++++--- resources/assets/v2/src/store/set-variable.js | 7 +++-- .../dashboard/account-chart.blade.php | 18 ----------- .../v2/partials/dashboard/boxes.blade.php | 2 +- 11 files changed, 46 insertions(+), 47 deletions(-) diff --git a/app/Api/V1/Controllers/Chart/AccountController.php b/app/Api/V1/Controllers/Chart/AccountController.php index 1e80d1c650..b8c4131d0f 100644 --- a/app/Api/V1/Controllers/Chart/AccountController.php +++ b/app/Api/V1/Controllers/Chart/AccountController.php @@ -87,6 +87,7 @@ class AccountController extends Controller // move date to end of day $queryParameters['start']->startOfDay(); $queryParameters['end']->endOfDay(); + Log::debug(sprintf('dashboard(), convert to native: %s', var_export($this->convertToNative, true))); // loop each account, and collect info: /** @var Account $account */ diff --git a/app/Api/V1/Controllers/Models/Transaction/ShowController.php b/app/Api/V1/Controllers/Models/Transaction/ShowController.php index 97b38ba78f..b20fab792d 100644 --- a/app/Api/V1/Controllers/Models/Transaction/ShowController.php +++ b/app/Api/V1/Controllers/Models/Transaction/ShowController.php @@ -147,6 +147,7 @@ class ShowController extends Controller $enrichment->setUser($admin); $selectedGroup = $enrichment->enrichSingle($selectedGroup); + /** @var TransactionGroupTransformer $transformer */ $transformer = app(TransactionGroupTransformer::class); $transformer->setParameters($this->parameters); diff --git a/app/Helpers/Collector/GroupCollector.php b/app/Helpers/Collector/GroupCollector.php index 3112fcfdfa..73c4414227 100644 --- a/app/Helpers/Collector/GroupCollector.php +++ b/app/Helpers/Collector/GroupCollector.php @@ -558,7 +558,6 @@ class GroupCollector implements GroupCollectorInterface $groups[$groupId]['transactions'][$journalId] = $this->parseAugmentedJournal($augumentedJournal); } } - $groups = $this->parseSums($groups); return new Collection($groups); diff --git a/app/Transformers/TransactionGroupTransformer.php b/app/Transformers/TransactionGroupTransformer.php index 8482360c6a..8a49e64d9b 100644 --- a/app/Transformers/TransactionGroupTransformer.php +++ b/app/Transformers/TransactionGroupTransformer.php @@ -121,6 +121,15 @@ class TransactionGroupTransformer extends AbstractTransformer if (null !== $transaction['foreign_amount'] && '' !== $transaction['foreign_amount'] && 0 !== bccomp('0', (string) $transaction['foreign_amount'])) { $foreignAmount = app('steam')->positive($transaction['foreign_amount']); } + + // set native amount to the normal amount if the currency matches. + if($transaction['native_currency']['id'] ?? null === $transaction['currency_id']) { + $transaction['native_amount'] = $amount; + } + + if(array_key_exists('native_amount', $transaction) && null !== $transaction['native_amount']) { + $transaction['native_amount'] = app('steam')->positive($transaction['native_amount']); + } $type = $this->stringFromArray($transaction, 'transaction_type_type', TransactionTypeEnum::WITHDRAWAL->value); // must be 0 (int) or NULL diff --git a/resources/assets/v2/src/api/v1/chart/account/dashboard.js b/resources/assets/v2/src/api/v1/chart/account/dashboard.js index f5c1870393..90cf920ee2 100644 --- a/resources/assets/v2/src/api/v1/chart/account/dashboard.js +++ b/resources/assets/v2/src/api/v1/chart/account/dashboard.js @@ -25,7 +25,7 @@ export default class Dashboard { dashboard(start, end) { let startStr = format(start, 'y-MM-dd'); let endStr = format(end, 'y-MM-dd'); - return api.get('/api/v1/chart/account/dashboard', {params: {fix: true, start: startStr, end: endStr}}); + return api.get('/api/v1/chart/account/dashboard', {params: {start: startStr, end: endStr}}); } expense(start, end) { diff --git a/resources/assets/v2/src/pages/dashboard/accounts.js b/resources/assets/v2/src/pages/dashboard/accounts.js index ba1f32cff4..ca7cac9d74 100644 --- a/resources/assets/v2/src/pages/dashboard/accounts.js +++ b/resources/assets/v2/src/pages/dashboard/accounts.js @@ -40,19 +40,14 @@ export default () => ({ loadingAccounts: false, accountList: [], convertToNative: false, - convertToNativeAvailable: false, chartOptions: null, - switchConvertToNative() { - this.convertToNative = !this.convertToNative; - setVariable('convert_to_native', this.convertToNative); - }, localCacheKey(type) { return 'ds_accounts_' + type; }, eventListeners: { ['@convert-to-native.window'](event){ - console.log('I heard that! it is now ' + event.detail); + console.log('I heard that! (dashboard/accounts)'); this.convertToNative = event.detail; this.accountList = []; chartData = null; @@ -62,19 +57,16 @@ export default () => ({ }, - doSomeReload() { - console.log('doSomeReload'); - }, getFreshData() { - console.log('get fresh data'); const start = new Date(window.store.get('start')); const end = new Date(window.store.get('end')); - const chartCacheKey = getCacheKey(this.localCacheKey('chart'), {start: start, end: end}) + const chartCacheKey = getCacheKey(this.localCacheKey('chart'), {convertToNative: this.convertToNative, start: start, end: end}) const cacheValid = window.store.get('cacheValid'); let cachedData = window.store.get(chartCacheKey); if (cacheValid && typeof cachedData !== 'undefined') { + console.log('Generate from cache: ', chartCacheKey); this.drawChart(this.generateOptions(cachedData)); this.loading = false; return; @@ -84,6 +76,7 @@ export default () => ({ this.chartData = response.data; // cache generated options: window.store.set(chartCacheKey, response.data); + console.log('Generate FRESH!'); this.drawChart(this.generateOptions(this.chartData)); this.loading = false; }); @@ -108,14 +101,17 @@ export default () => ({ // use the "native" currency code and use the "native_entries" as array if (this.convertToNative) { - console.log('Convert to native!'); currencies.push(current.native_currency_code); dataset.currency_code = current.native_currency_code; - collection = Object.values(current.native_entries); + if(!current.hasOwnProperty('native_entries')) { + console.error('No native entries ('+this.convertToNative+') found for account: ', current); + } + if(current.hasOwnProperty('native_entries')) { + collection = Object.values(current.native_entries); + } yAxis = 'y' + current.native_currency_code; } if (!this.convertToNative) { - console.log('NO convert to native!', this.convertToNative); yAxis = 'y' + current.currency_code; dataset.currency_code = current.currency_code; currencies.push(current.currency_code); @@ -155,9 +151,7 @@ export default () => ({ return options; }, loadChart() { - console.log('loadChart'); if (true === this.loading) { - console.log('already loading chart'); return; } this.loading = true; @@ -175,7 +169,6 @@ export default () => ({ chart.options = options.options; chart.data = options.data; chart.update(); - console.log('refresh chart'); return; } chart = new Chart(document.querySelector("#account-chart"), options); @@ -303,9 +296,8 @@ export default () => ({ ]).then((values) => { //console.log('accounts after promises'); this.convertToNative = values[1] && values[3]; - this.convertToNativeAvailable = values[3]; afterPromises = true; - console.log('convertToNative in accounts.js: ', values); + //console.log('convertToNative in accounts.js: ', values); // main dashboard chart: this.loadChart(); diff --git a/resources/assets/v2/src/pages/dashboard/boxes.js b/resources/assets/v2/src/pages/dashboard/boxes.js index 5621de3635..109f480573 100644 --- a/resources/assets/v2/src/pages/dashboard/boxes.js +++ b/resources/assets/v2/src/pages/dashboard/boxes.js @@ -35,11 +35,21 @@ export default () => ({ loading: false, boxData: null, boxOptions: null, + eventListeners: { + ['@convert-to-native.window'](event){ + this.convertToNative = event.detail; + this.accountList = []; + console.log('I heard that!'); + this.boxData = null; + this.loadBoxes(); + } + }, + getFreshData() { const start = new Date(window.store.get('start')); const end = new Date(window.store.get('end')); // TODO cache key is hard coded, problem? - const boxesCacheKey = getCacheKey('ds_boxes_data', {start: start, end: end}); + const boxesCacheKey = getCacheKey('ds_boxes_data', {convertToNative: this.convertToNative, start: start, end: end}); cleanupCache(); //const cacheValid = window.store.get('cacheValid'); diff --git a/resources/assets/v2/src/pages/dashboard/sankey.js b/resources/assets/v2/src/pages/dashboard/sankey.js index fae9f4f044..e03b4476a2 100644 --- a/resources/assets/v2/src/pages/dashboard/sankey.js +++ b/resources/assets/v2/src/pages/dashboard/sankey.js @@ -166,6 +166,11 @@ export default () => ({ // properties of the transaction, used in the generation of the chart: let transaction = group.attributes.transactions[ii]; let currencyCode = this.convertToNative ? transaction.native_currency_code : transaction.currency_code; + if(this.convertToNative && (!transaction.hasOwnProperty('native_amount') || null === transaction.native_amount)) { + // skip this transaction, it has no native amount. + console.error('No native amount for transaction #' + group.id + ' ('+this.convertToNative+')'); + continue; + } let amount = this.convertToNative ? parseFloat(transaction.native_amount) : parseFloat(transaction.amount); let flowKey; @@ -313,7 +318,7 @@ export default () => ({ downloadTransactions(params) { const start = new Date(window.store.get('start')); const end = new Date(window.store.get('end')); - const cacheKey = getCacheKey(SANKEY_CACHE_KEY, {start: start, end: end}); + const cacheKey = getCacheKey(SANKEY_CACHE_KEY, {convertToNative: this.convertToNative, start: start, end: end}); //console.log('Downloading page ' + params.page + '...'); const getter = new Get(); @@ -353,9 +358,6 @@ export default () => ({ this.convertToNative = values[0]; convertToNative = values[0]; - this.convertToNative = false; - convertToNative = false; - // some translations: translations.all_money = i18next.t('firefly.all_money'); translations.category = i18next.t('firefly.category'); diff --git a/resources/assets/v2/src/store/set-variable.js b/resources/assets/v2/src/store/set-variable.js index 11802e12d0..c638e8a4e6 100644 --- a/resources/assets/v2/src/store/set-variable.js +++ b/resources/assets/v2/src/store/set-variable.js @@ -28,7 +28,7 @@ export function setVariable(name, value = null) { // then again, it's not that slow. // set in window.x - // window[name] = value; + window[name] = value; // set in store: window.store.set(name, value); @@ -36,11 +36,14 @@ export function setVariable(name, value = null) { // post to user preferences (because why not): let putter = new Put(); putter.put(name, value).then((response) => { - }).catch(() => { + console.log('set "'+name+'" to value: ', value); + }).catch((error) => { + console.error(error); // preference does not exist (yet). // POST it let poster = (new Post); poster.post(name, value).then((response) => { + console.log('POST "'+name+'" to value: ', value); }); }); } diff --git a/resources/views/v2/partials/dashboard/account-chart.blade.php b/resources/views/v2/partials/dashboard/account-chart.blade.php index 3e173575ec..d2fbd67559 100644 --- a/resources/views/v2/partials/dashboard/account-chart.blade.php +++ b/resources/views/v2/partials/dashboard/account-chart.blade.php @@ -9,24 +9,6 @@
- diff --git a/resources/views/v2/partials/dashboard/boxes.blade.php b/resources/views/v2/partials/dashboard/boxes.blade.php index 479821e80d..05d2d61f70 100644 --- a/resources/views/v2/partials/dashboard/boxes.blade.php +++ b/resources/views/v2/partials/dashboard/boxes.blade.php @@ -1,4 +1,4 @@ -
+