|  |  | @ -20,10 +20,7 @@ import Big from 'big.js'; | 
			
		
	
		
			
				
					|  |  |  | import { countries } from 'countries-list'; | 
			
		
	
		
			
				
					|  |  |  | import { addDays, format, isSameDay } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import yahooFinance from 'yahoo-finance2'; | 
			
		
	
		
			
				
					|  |  |  | import type { | 
			
		
	
		
			
				
					|  |  |  |   Price, | 
			
		
	
		
			
				
					|  |  |  |   QuoteSummaryResult | 
			
		
	
		
			
				
					|  |  |  | } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface'; | 
			
		
	
		
			
				
					|  |  |  | import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | @Injectable() | 
			
		
	
		
			
				
					|  |  |  | export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
	
		
			
				
					|  |  | @ -92,7 +89,12 @@ export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
		
			
				
					|  |  |  |       response.assetSubClass = assetSubClass; | 
			
		
	
		
			
				
					|  |  |  |       response.currency = assetProfile.price.currency; | 
			
		
	
		
			
				
					|  |  |  |       response.dataSource = this.getName(); | 
			
		
	
		
			
				
					|  |  |  |       response.name = this.formatName(assetProfile); | 
			
		
	
		
			
				
					|  |  |  |       response.name = this.formatName({ | 
			
		
	
		
			
				
					|  |  |  |         longName: assetProfile.price.longName, | 
			
		
	
		
			
				
					|  |  |  |         quoteType: assetProfile.price.quoteType, | 
			
		
	
		
			
				
					|  |  |  |         shortName: assetProfile.price.shortName, | 
			
		
	
		
			
				
					|  |  |  |         symbol: assetProfile.price.symbol | 
			
		
	
		
			
				
					|  |  |  |       }); | 
			
		
	
		
			
				
					|  |  |  |       response.symbol = aSymbol; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |       if ( | 
			
		
	
	
		
			
				
					|  |  | @ -247,7 +249,7 @@ export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |       const quotes = searchResult.quotes | 
			
		
	
		
			
				
					|  |  |  |         .filter((quote) => { | 
			
		
	
		
			
				
					|  |  |  |           // filter out undefined symbols
 | 
			
		
	
		
			
				
					|  |  |  |           // Filter out undefined symbols
 | 
			
		
	
		
			
				
					|  |  |  |           return quote.symbol; | 
			
		
	
		
			
				
					|  |  |  |         }) | 
			
		
	
		
			
				
					|  |  |  |         .filter(({ quoteType, symbol }) => { | 
			
		
	
	
		
			
				
					|  |  | @ -256,7 +258,7 @@ export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
		
			
				
					|  |  |  |               this.cryptocurrencyService.isCryptocurrency( | 
			
		
	
		
			
				
					|  |  |  |                 symbol.replace(new RegExp(`-${baseCurrency}$`), baseCurrency) | 
			
		
	
		
			
				
					|  |  |  |               )) || | 
			
		
	
		
			
				
					|  |  |  |             ['EQUITY', 'ETF', 'MUTUALFUND'].includes(quoteType) | 
			
		
	
		
			
				
					|  |  |  |             ['EQUITY', 'ETF', 'FUTURE', 'MUTUALFUND'].includes(quoteType) | 
			
		
	
		
			
				
					|  |  |  |           ); | 
			
		
	
		
			
				
					|  |  |  |         }) | 
			
		
	
		
			
				
					|  |  |  |         .filter(({ quoteType, symbol }) => { | 
			
		
	
	
		
			
				
					|  |  | @ -264,6 +266,9 @@ export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
		
			
				
					|  |  |  |             // Only allow cryptocurrencies in base currency to avoid having redundancy in the database.
 | 
			
		
	
		
			
				
					|  |  |  |             // Transactions need to be converted manually to the base currency before
 | 
			
		
	
		
			
				
					|  |  |  |             return symbol.includes(baseCurrency); | 
			
		
	
		
			
				
					|  |  |  |           } else if (quoteType === 'FUTURE') { | 
			
		
	
		
			
				
					|  |  |  |             // Allow GC=F, but not MGC=F
 | 
			
		
	
		
			
				
					|  |  |  |             return symbol.length === 4; | 
			
		
	
		
			
				
					|  |  |  |           } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |           return true; | 
			
		
	
	
		
			
				
					|  |  | @ -288,7 +293,12 @@ export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
		
			
				
					|  |  |  |           symbol, | 
			
		
	
		
			
				
					|  |  |  |           currency: marketDataItem.currency, | 
			
		
	
		
			
				
					|  |  |  |           dataSource: this.getName(), | 
			
		
	
		
			
				
					|  |  |  |           name: quote?.longname || quote?.shortname || symbol | 
			
		
	
		
			
				
					|  |  |  |           name: this.formatName({ | 
			
		
	
		
			
				
					|  |  |  |             longName: quote.longname, | 
			
		
	
		
			
				
					|  |  |  |             quoteType: quote.quoteType, | 
			
		
	
		
			
				
					|  |  |  |             shortName: quote.shortname, | 
			
		
	
		
			
				
					|  |  |  |             symbol: quote.symbol | 
			
		
	
		
			
				
					|  |  |  |           }) | 
			
		
	
		
			
				
					|  |  |  |         }); | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |     } catch (error) { | 
			
		
	
	
		
			
				
					|  |  | @ -298,8 +308,18 @@ export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
		
			
				
					|  |  |  |     return { items }; | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   private formatName(aAssetProfile: QuoteSummaryResult) { | 
			
		
	
		
			
				
					|  |  |  |     let name = aAssetProfile.price.longName; | 
			
		
	
		
			
				
					|  |  |  |   private formatName({ | 
			
		
	
		
			
				
					|  |  |  |     longName, | 
			
		
	
		
			
				
					|  |  |  |     quoteType, | 
			
		
	
		
			
				
					|  |  |  |     shortName, | 
			
		
	
		
			
				
					|  |  |  |     symbol | 
			
		
	
		
			
				
					|  |  |  |   }: { | 
			
		
	
		
			
				
					|  |  |  |     longName: Price['longName']; | 
			
		
	
		
			
				
					|  |  |  |     quoteType: Price['quoteType']; | 
			
		
	
		
			
				
					|  |  |  |     shortName: Price['shortName']; | 
			
		
	
		
			
				
					|  |  |  |     symbol: Price['symbol']; | 
			
		
	
		
			
				
					|  |  |  |   }) { | 
			
		
	
		
			
				
					|  |  |  |     let name = longName; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     if (name) { | 
			
		
	
		
			
				
					|  |  |  |       name = name.replace('iShares ETF (CH) - ', ''); | 
			
		
	
	
		
			
				
					|  |  | @ -314,7 +334,12 @@ export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
		
			
				
					|  |  |  |       name = name.replace('Xtrackers (IE) Plc - ', ''); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     return name || aAssetProfile.price.shortName || aAssetProfile.price.symbol; | 
			
		
	
		
			
				
					|  |  |  |     if (quoteType === 'FUTURE') { | 
			
		
	
		
			
				
					|  |  |  |       // "Gold Jun 22" -> "Gold"
 | 
			
		
	
		
			
				
					|  |  |  |       name = shortName?.slice(0, -6); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     return name || shortName || symbol; | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   private parseAssetClass(aPrice: Price): { | 
			
		
	
	
		
			
				
					|  |  | @ -337,6 +362,10 @@ export class YahooFinanceService implements DataProviderInterface { | 
			
		
	
		
			
				
					|  |  |  |         assetClass = AssetClass.EQUITY; | 
			
		
	
		
			
				
					|  |  |  |         assetSubClass = AssetSubClass.ETF; | 
			
		
	
		
			
				
					|  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |       case 'future': | 
			
		
	
		
			
				
					|  |  |  |         assetClass = AssetClass.COMMODITY; | 
			
		
	
		
			
				
					|  |  |  |         assetSubClass = AssetSubClass.COMMODITY; | 
			
		
	
		
			
				
					|  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |       case 'mutualfund': | 
			
		
	
		
			
				
					|  |  |  |         assetClass = AssetClass.EQUITY; | 
			
		
	
		
			
				
					|  |  |  |         assetSubClass = AssetSubClass.MUTUALFUND; | 
			
		
	
	
		
			
				
					|  |  | 
 |