From 6cd79fab310fe348c2faeb8ba8c81793b1d6988d Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 16 Mar 2025 20:59:21 +0100
Subject: [PATCH] Feature/rename TWR to ROAI (#4453)

* Rename TWR to ROAI
---
 .../calculator/portfolio-calculator.factory.ts         |  8 ++++----
 ...culator-baln-buy-and-sell-in-two-activities.spec.ts |  2 +-
 .../portfolio-calculator-baln-buy-and-sell.spec.ts     |  2 +-
 .../portfolio-calculator-baln-buy.spec.ts              |  2 +-
 ...io-calculator-btcusd-buy-and-sell-partially.spec.ts |  2 +-
 .../{twr => roai}/portfolio-calculator-fee.spec.ts     |  2 +-
 .../portfolio-calculator-googl-buy.spec.ts             |  2 +-
 .../{twr => roai}/portfolio-calculator-item.spec.ts    |  2 +-
 .../portfolio-calculator-liability.spec.ts             |  2 +-
 ...portfolio-calculator-msft-buy-with-dividend.spec.ts |  2 +-
 .../portfolio-calculator-no-orders.spec.ts             |  2 +-
 ...olio-calculator-novn-buy-and-sell-partially.spec.ts |  2 +-
 .../portfolio-calculator-novn-buy-and-sell.spec.ts     |  2 +-
 .../{twr => roai}/portfolio-calculator.spec.ts         |  0
 .../calculator/{twr => roai}/portfolio-calculator.ts   |  2 +-
 apps/api/src/app/portfolio/portfolio.service.ts        | 10 +++++-----
 .../portfolio-snapshot/portfolio-snapshot.processor.ts |  2 +-
 .../portfolio-summary/portfolio-summary.component.html |  4 ++--
 18 files changed, 25 insertions(+), 25 deletions(-)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts (96%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-baln-buy-and-sell.spec.ts (99%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-baln-buy.spec.ts (99%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts (99%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-fee.spec.ts (99%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-googl-buy.spec.ts (99%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-item.spec.ts (99%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-liability.spec.ts (98%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-msft-buy-with-dividend.spec.ts (99%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-no-orders.spec.ts (98%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-novn-buy-and-sell-partially.spec.ts (99%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator-novn-buy-and-sell.spec.ts (96%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator.spec.ts (100%)
 rename apps/api/src/app/portfolio/calculator/{twr => roai}/portfolio-calculator.ts (99%)

diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts
index 18738373e..70f27fe7b 100644
--- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts
+++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts
@@ -10,11 +10,11 @@ import { Injectable } from '@nestjs/common';
 
 import { MWRPortfolioCalculator } from './mwr/portfolio-calculator';
 import { PortfolioCalculator } from './portfolio-calculator';
-import { TWRPortfolioCalculator } from './twr/portfolio-calculator';
+import { RoaiPortfolioCalculator } from './roai/portfolio-calculator';
 
 export enum PerformanceCalculationType {
   MWR = 'MWR', // Money-Weighted Rate of Return
-  TWR = 'TWR' // Time-Weighted Rate of Return
+  ROAI = 'ROAI' // Return on Average Investment
 }
 
 @Injectable()
@@ -56,8 +56,8 @@ export class PortfolioCalculatorFactory {
           portfolioSnapshotService: this.portfolioSnapshotService,
           redisCacheService: this.redisCacheService
         });
-      case PerformanceCalculationType.TWR:
-        return new TWRPortfolioCalculator({
+      case PerformanceCalculationType.ROAI:
+        return new RoaiPortfolioCalculator({
           accountBalanceItems,
           activities,
           currency,
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
similarity index 96%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
index deb3cd72f..e157e2d26 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
@@ -137,7 +137,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'CHF',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts
index 7b4d53b2f..a1650ea82 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts
@@ -122,7 +122,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'CHF',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts
index 002cbd5e9..63a4d77b4 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts
@@ -107,7 +107,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'CHF',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
index 640de3985..2853e3d87 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
@@ -136,7 +136,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'CHF',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-fee.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-fee.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts
index 6f030a73d..b96e4f540 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-fee.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts
@@ -107,7 +107,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'USD',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-googl-buy.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts
index 4e25c17f7..b3793a5b4 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-googl-buy.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts
@@ -120,7 +120,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'CHF',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-item.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-item.spec.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-item.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-item.spec.ts
index 7fc5c526d..d226fe6f8 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-item.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-item.spec.ts
@@ -107,7 +107,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'USD',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-liability.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts
similarity index 98%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-liability.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts
index 5fa90e94c..569212b9a 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-liability.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts
@@ -107,7 +107,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'USD',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-msft-buy-with-dividend.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
index 543985424..4c54ba7aa 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-msft-buy-with-dividend.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
@@ -135,7 +135,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'USD',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts
similarity index 98%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts
index 84898490f..77e3f6157 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts
@@ -84,7 +84,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities: [],
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'CHF',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
index 37f22e2f6..84bcc5bc1 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
@@ -116,7 +116,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'CHF',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts
similarity index 96%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts
index caf196f54..937fd8b48 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts
@@ -116,7 +116,7 @@ describe('PortfolioCalculator', () => {
 
       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: 'CHF',
         userId: userDummyData.id
       });
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts
similarity index 100%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.spec.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts
diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
similarity index 99%
rename from apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts
rename to apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
index 059b85441..5b918fa03 100644
--- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
@@ -15,7 +15,7 @@ import { Big } from 'big.js';
 import { addMilliseconds, differenceInDays, format, isBefore } from 'date-fns';
 import { cloneDeep, sortBy } from 'lodash';
 
-export class TWRPortfolioCalculator extends PortfolioCalculator {
+export class RoaiPortfolioCalculator extends PortfolioCalculator {
   private chartDates: string[];
 
   protected calculateOverallPerformance(
diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts
index ce03c8024..e90ebd4ae 100644
--- a/apps/api/src/app/portfolio/portfolio.service.ts
+++ b/apps/api/src/app/portfolio/portfolio.service.ts
@@ -295,7 +295,7 @@ export class PortfolioService {
       activities,
       filters,
       userId,
-      calculationType: PerformanceCalculationType.TWR,
+      calculationType: PerformanceCalculationType.ROAI,
       currency: this.request.user.Settings.settings.baseCurrency
     });
 
@@ -372,7 +372,7 @@ export class PortfolioService {
       activities,
       filters,
       userId,
-      calculationType: PerformanceCalculationType.TWR,
+      calculationType: PerformanceCalculationType.ROAI,
       currency: userCurrency
     });
 
@@ -680,7 +680,7 @@ export class PortfolioService {
     const portfolioCalculator = this.calculatorFactory.createCalculator({
       activities,
       userId,
-      calculationType: PerformanceCalculationType.TWR,
+      calculationType: PerformanceCalculationType.ROAI,
       currency: userCurrency
     });
 
@@ -950,7 +950,7 @@ export class PortfolioService {
       activities,
       filters,
       userId,
-      calculationType: PerformanceCalculationType.TWR,
+      calculationType: PerformanceCalculationType.ROAI,
       currency: this.request.user.Settings.settings.baseCurrency
     });
 
@@ -1116,7 +1116,7 @@ export class PortfolioService {
       activities,
       filters,
       userId,
-      calculationType: PerformanceCalculationType.TWR,
+      calculationType: PerformanceCalculationType.ROAI,
       currency: userCurrency
     });
 
diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts
index 93b34cbdf..60c3cf695 100644
--- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts
+++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts
@@ -68,7 +68,7 @@ export class PortfolioSnapshotProcessor {
       const portfolioCalculator = this.calculatorFactory.createCalculator({
         accountBalanceItems,
         activities,
-        calculationType: PerformanceCalculationType.TWR,
+        calculationType: PerformanceCalculationType.ROAI,
         currency: job.data.userCurrency,
         filters: job.data.filters,
         userId: job.data.userId
diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
index 2a8880225..1a52bd646 100644
--- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
@@ -117,8 +117,8 @@
       <ng-container i18n>Net Performance</ng-container>
       <abbr
         class="initialism ml-2 text-muted"
-        title="Time-Weighted Rate of Return"
-        >(TWR)</abbr
+        title="Return on Average Investment"
+        >(ROAI)</abbr
       >
     </div>
     <div class="flex-column flex-wrap justify-content-end">