Browse Source

Refactor calculations with big.js

pull/710/head
Thomas 3 years ago
parent
commit
b0a3cc297e
  1. 42
      libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts

42
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts

@ -11,6 +11,7 @@ import {
import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { UNKNOWN_KEY } from '@ghostfolio/common/config';
import { getTextColor } from '@ghostfolio/common/helper'; import { getTextColor } from '@ghostfolio/common/helper';
import { PortfolioPosition } from '@ghostfolio/common/interfaces'; import { PortfolioPosition } from '@ghostfolio/common/interfaces';
import Big from 'big.js';
import { Tooltip } from 'chart.js'; import { Tooltip } from 'chart.js';
import { LinearScale } from 'chart.js'; import { LinearScale } from 'chart.js';
import { ArcElement } from 'chart.js'; import { ArcElement } from 'chart.js';
@ -78,16 +79,17 @@ export class PortfolioProportionChartComponent
[symbol: string]: { [symbol: string]: {
color?: string; color?: string;
name: string; name: string;
subCategory: { [symbol: string]: { value: number } }; subCategory: { [symbol: string]: { value: Big } };
value: number; value: Big;
}; };
} = {}; } = {};
Object.keys(this.positions).forEach((symbol) => { Object.keys(this.positions).forEach((symbol) => {
if (this.positions[symbol][this.keys[0]]) { if (this.positions[symbol][this.keys[0]]) {
if (chartData[this.positions[symbol][this.keys[0]]]) { if (chartData[this.positions[symbol][this.keys[0]]]) {
chartData[this.positions[symbol][this.keys[0]]].value += chartData[this.positions[symbol][this.keys[0]]].value = chartData[
this.positions[symbol].value; this.positions[symbol][this.keys[0]]
].value.plus(this.positions[symbol].value);
if ( if (
chartData[this.positions[symbol][this.keys[0]]].subCategory[ chartData[this.positions[symbol][this.keys[0]]].subCategory[
@ -96,37 +98,43 @@ export class PortfolioProportionChartComponent
) { ) {
chartData[this.positions[symbol][this.keys[0]]].subCategory[ chartData[this.positions[symbol][this.keys[0]]].subCategory[
this.positions[symbol][this.keys[1]] this.positions[symbol][this.keys[1]]
].value += this.positions[symbol].value; ].value = chartData[
this.positions[symbol][this.keys[0]]
].subCategory[this.positions[symbol][this.keys[1]]].value.plus(
this.positions[symbol].value
);
} else { } else {
chartData[this.positions[symbol][this.keys[0]]].subCategory[ chartData[this.positions[symbol][this.keys[0]]].subCategory[
this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY
] = { value: this.positions[symbol].value }; ] = { value: new Big(this.positions[symbol].value) };
} }
} else { } else {
chartData[this.positions[symbol][this.keys[0]]] = { chartData[this.positions[symbol][this.keys[0]]] = {
name: this.positions[symbol].name, name: this.positions[symbol].name,
subCategory: {}, subCategory: {},
value: this.positions[symbol].value value: new Big(this.positions[symbol].value)
}; };
if (this.positions[symbol][this.keys[1]]) { if (this.positions[symbol][this.keys[1]]) {
chartData[this.positions[symbol][this.keys[0]]].subCategory = { chartData[this.positions[symbol][this.keys[0]]].subCategory = {
[this.positions[symbol][this.keys[1]]]: { [this.positions[symbol][this.keys[1]]]: {
value: this.positions[symbol].value value: new Big(this.positions[symbol].value)
} }
}; };
} }
} }
} else { } else {
if (chartData[UNKNOWN_KEY]) { if (chartData[UNKNOWN_KEY]) {
chartData[UNKNOWN_KEY].value += this.positions[symbol].value; chartData[UNKNOWN_KEY].value = chartData[UNKNOWN_KEY].value.plus(
this.positions[symbol].value
);
} else { } else {
chartData[UNKNOWN_KEY] = { chartData[UNKNOWN_KEY] = {
name: this.positions[symbol].name, name: this.positions[symbol].name,
subCategory: this.keys[1] subCategory: this.keys[1]
? { [this.keys[1]]: { value: 0 } } ? { [this.keys[1]]: { value: new Big(0) } }
: undefined, : undefined,
value: this.positions[symbol].value value: new Big(this.positions[symbol].value)
}; };
} }
} }
@ -134,7 +142,7 @@ export class PortfolioProportionChartComponent
let chartDataSorted = Object.entries(chartData) let chartDataSorted = Object.entries(chartData)
.sort((a, b) => { .sort((a, b) => {
return a[1].value - b[1].value; return a[1].value.minus(b[1].value).toNumber();
}) })
.reverse(); .reverse();
@ -152,7 +160,7 @@ export class PortfolioProportionChartComponent
if (!unknownItem) { if (!unknownItem) {
chartDataSorted.push([ chartDataSorted.push([
UNKNOWN_KEY, UNKNOWN_KEY,
{ name: UNKNOWN_KEY, subCategory: {}, value: 0 } { name: UNKNOWN_KEY, subCategory: {}, value: new Big(0) }
]); ]);
unknownItem = chartDataSorted[chartDataSorted.length - 1]; unknownItem = chartDataSorted[chartDataSorted.length - 1];
} }
@ -162,7 +170,7 @@ export class PortfolioProportionChartComponent
unknownItem[1] = { unknownItem[1] = {
name: UNKNOWN_KEY, name: UNKNOWN_KEY,
subCategory: {}, subCategory: {},
value: unknownItem[1].value + restItem[1].value value: unknownItem[1].value.plus(restItem[1].value)
}; };
} }
}); });
@ -170,7 +178,7 @@ export class PortfolioProportionChartComponent
// Sort data again // Sort data again
chartDataSorted = chartDataSorted chartDataSorted = chartDataSorted
.sort((a, b) => { .sort((a, b) => {
return a[1].value - b[1].value; return a[1].value.minus(b[1].value).toNumber();
}) })
.reverse(); .reverse();
} }
@ -201,7 +209,7 @@ export class PortfolioProportionChartComponent
backgroundColorSubCategory.push( backgroundColorSubCategory.push(
Color(item.color).lighten(lightnessRatio).hex() Color(item.color).lighten(lightnessRatio).hex()
); );
dataSubCategory.push(item.subCategory[subCategory].value); dataSubCategory.push(item.subCategory[subCategory].value.toNumber());
labelSubCategory.push(subCategory); labelSubCategory.push(subCategory);
lightnessRatio += 0.1; lightnessRatio += 0.1;
@ -215,7 +223,7 @@ export class PortfolioProportionChartComponent
}), }),
borderWidth: 0, borderWidth: 0,
data: chartDataSorted.map(([, item]) => { data: chartDataSorted.map(([, item]) => {
return item.value; return item.value.toNumber();
}) })
} }
]; ];

Loading…
Cancel
Save