|  |  | @ -15,11 +15,15 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   addDays, | 
			
		
	
		
			
				
					|  |  |  |   addMonths, | 
			
		
	
		
			
				
					|  |  |  |   addYears, | 
			
		
	
		
			
				
					|  |  |  |   endOfDay, | 
			
		
	
		
			
				
					|  |  |  |   format, | 
			
		
	
		
			
				
					|  |  |  |   isAfter, | 
			
		
	
		
			
				
					|  |  |  |   isBefore, | 
			
		
	
		
			
				
					|  |  |  |   max, | 
			
		
	
		
			
				
					|  |  |  |   min, | 
			
		
	
		
			
				
					|  |  |  |   parse | 
			
		
	
		
			
				
					|  |  |  | } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { flatten } from 'lodash'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | const DATE_FORMAT = 'yyyy-MM-dd'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -168,7 +172,7 @@ export class PortfolioCalculator { | 
			
		
	
		
			
				
					|  |  |  |     const start = dparse(startDate); | 
			
		
	
		
			
				
					|  |  |  |     const end = dparse(endDate); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     const timelinePeriodPromises: Promise<TimelinePeriod>[] = []; | 
			
		
	
		
			
				
					|  |  |  |     const timelinePeriodPromises: Promise<TimelinePeriod[]>[] = []; | 
			
		
	
		
			
				
					|  |  |  |     let i = 0; | 
			
		
	
		
			
				
					|  |  |  |     let j = -1; | 
			
		
	
		
			
				
					|  |  |  |     for ( | 
			
		
	
	
		
			
				
					|  |  | @ -188,33 +192,50 @@ export class PortfolioCalculator { | 
			
		
	
		
			
				
					|  |  |  |       ) { | 
			
		
	
		
			
				
					|  |  |  |         j++; | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |       const timePeriodForDate = this.getTimePeriodForDate(j, currentDate); | 
			
		
	
		
			
				
					|  |  |  |       if (timePeriodForDate != null) { | 
			
		
	
		
			
				
					|  |  |  |         timelinePeriodPromises.push(timePeriodForDate); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |       let endDate = endOfDay(currentDate); | 
			
		
	
		
			
				
					|  |  |  |       if (timelineSpecification[i].accuracy === 'day') { | 
			
		
	
		
			
				
					|  |  |  |         let nextEndDate: Date = end; | 
			
		
	
		
			
				
					|  |  |  |         if (j + 1 < this.transactionPoints.length) { | 
			
		
	
		
			
				
					|  |  |  |           nextEndDate = dparse(this.transactionPoints[j + 1].date); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         endDate = min([ | 
			
		
	
		
			
				
					|  |  |  |           addMonths(currentDate, 1), | 
			
		
	
		
			
				
					|  |  |  |           max([currentDate, nextEndDate]) | 
			
		
	
		
			
				
					|  |  |  |         ]); | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |       const timePeriodForDates = this.getTimePeriodForDate( | 
			
		
	
		
			
				
					|  |  |  |         j, | 
			
		
	
		
			
				
					|  |  |  |         currentDate, | 
			
		
	
		
			
				
					|  |  |  |         endDate | 
			
		
	
		
			
				
					|  |  |  |       ); | 
			
		
	
		
			
				
					|  |  |  |       if (timePeriodForDates != null) { | 
			
		
	
		
			
				
					|  |  |  |         timelinePeriodPromises.push(timePeriodForDates); | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     console.timeEnd('calculate-timeline-calculations'); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     console.time('calculate-timeline-periods'); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     const timelinePeriods: TimelinePeriod[] = await Promise.all( | 
			
		
	
		
			
				
					|  |  |  |     const timelinePeriods: TimelinePeriod[][] = await Promise.all( | 
			
		
	
		
			
				
					|  |  |  |       timelinePeriodPromises | 
			
		
	
		
			
				
					|  |  |  |     ); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     console.timeEnd('calculate-timeline-periods'); | 
			
		
	
		
			
				
					|  |  |  |     console.timeEnd('calculate-timeline-total'); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     return timelinePeriods; | 
			
		
	
		
			
				
					|  |  |  |     return flatten(timelinePeriods); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   private async getTimePeriodForDate( | 
			
		
	
		
			
				
					|  |  |  |     j: number, | 
			
		
	
		
			
				
					|  |  |  |     currentDate: Date | 
			
		
	
		
			
				
					|  |  |  |   ): Promise<TimelinePeriod> { | 
			
		
	
		
			
				
					|  |  |  |     startDate: Date, | 
			
		
	
		
			
				
					|  |  |  |     endDate: Date | 
			
		
	
		
			
				
					|  |  |  |   ): Promise<TimelinePeriod[]> { | 
			
		
	
		
			
				
					|  |  |  |     let investment: Big = new Big(0); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     let value = new Big(0); | 
			
		
	
		
			
				
					|  |  |  |     const currentDateAsString = format(currentDate, DATE_FORMAT); | 
			
		
	
		
			
				
					|  |  |  |     const currentDateAsString = format(startDate, DATE_FORMAT); | 
			
		
	
		
			
				
					|  |  |  |     if (j >= 0) { | 
			
		
	
		
			
				
					|  |  |  |       const currencies: { [name: string]: Currency } = {}; | 
			
		
	
		
			
				
					|  |  |  |       const symbols: string[] = []; | 
			
		
	
	
		
			
				
					|  |  | @ -229,15 +250,15 @@ export class PortfolioCalculator { | 
			
		
	
		
			
				
					|  |  |  |       if (symbols.length > 0) { | 
			
		
	
		
			
				
					|  |  |  |         try { | 
			
		
	
		
			
				
					|  |  |  |           marketSymbols = await this.currentRateService.getValues({ | 
			
		
	
		
			
				
					|  |  |  |             dateRangeStart: resetHours(currentDate), | 
			
		
	
		
			
				
					|  |  |  |             dateRangeEnd: resetHours(currentDate), | 
			
		
	
		
			
				
					|  |  |  |             dateRangeStart: resetHours(startDate), | 
			
		
	
		
			
				
					|  |  |  |             dateRangeEnd: resetHours(startDate), | 
			
		
	
		
			
				
					|  |  |  |             symbols, | 
			
		
	
		
			
				
					|  |  |  |             currencies, | 
			
		
	
		
			
				
					|  |  |  |             userCurrency: this.currency | 
			
		
	
		
			
				
					|  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |         } catch (e) { | 
			
		
	
		
			
				
					|  |  |  |           console.error( | 
			
		
	
		
			
				
					|  |  |  |             `failed to fetch info for date ${currentDate} with exception`, | 
			
		
	
		
			
				
					|  |  |  |             `failed to fetch info for date ${startDate} with exception`, | 
			
		
	
		
			
				
					|  |  |  |             e | 
			
		
	
		
			
				
					|  |  |  |           ); | 
			
		
	
		
			
				
					|  |  |  |           return null; | 
			
		
	
	
		
			
				
					|  |  | @ -269,12 +290,14 @@ export class PortfolioCalculator { | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     return { | 
			
		
	
		
			
				
					|  |  |  |       date: currentDateAsString, | 
			
		
	
		
			
				
					|  |  |  |       grossPerformance: value.minus(investment), | 
			
		
	
		
			
				
					|  |  |  |       investment, | 
			
		
	
		
			
				
					|  |  |  |       value | 
			
		
	
		
			
				
					|  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |     return [ | 
			
		
	
		
			
				
					|  |  |  |       { | 
			
		
	
		
			
				
					|  |  |  |         date: currentDateAsString, | 
			
		
	
		
			
				
					|  |  |  |         grossPerformance: value.minus(investment), | 
			
		
	
		
			
				
					|  |  |  |         investment, | 
			
		
	
		
			
				
					|  |  |  |         value | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |     ]; | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   private getFactor(type: OrderType) { | 
			
		
	
	
		
			
				
					|  |  | 
 |