| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -21,7 +21,8 @@ import { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import { UniqueAsset } from '@ghostfolio/common/interfaces'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  AccountWithPlatform, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  OrderWithAccount | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  OrderWithAccount, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  UserWithSettings | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} from '@ghostfolio/common/types'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import { Injectable } from '@nestjs/common'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import { DataSource, Prisma, SymbolProfile } from '@prisma/client'; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -138,17 +139,16 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    activitiesDto, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    isDryRun = false, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    maxActivitiesToImport, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    userCurrency, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    userId | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    user | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  }: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    accountsDto: Partial<CreateAccountDto>[]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    activitiesDto: Partial<CreateOrderDto>[]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    isDryRun?: boolean; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    maxActivitiesToImport: number; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    userCurrency: string; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    userId: string; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    user: UserWithSettings; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  }): Promise<Activity[]> { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const accountIdMapping: { [oldAccountId: string]: string } = {}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const userCurrency = user.Settings.settings.baseCurrency; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (!isDryRun && accountsDto?.length) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const [existingAccounts, existingPlatforms] = await Promise.all([ | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -171,7 +171,7 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        // If there is no account or if the account belongs to a different user then create a new account
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (!accountWithSameId || accountWithSameId.userId !== userId) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (!accountWithSameId || accountWithSameId.userId !== user.id) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          let oldAccountId: string; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          const platformId = account.platformId; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -184,7 +184,7 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          let accountObject: Prisma.AccountCreateInput = { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            ...account, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            User: { connect: { id: userId } } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            User: { connect: { id: user.id } } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          if ( | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -200,7 +200,7 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          const newAccount = await this.accountService.createAccount( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            accountObject, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            userId | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            user.id | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          // Store the new to old account ID mappings for updating activities
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -231,16 +231,17 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const assetProfiles = await this.validateActivities({ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      activitiesDto, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      maxActivitiesToImport | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      maxActivitiesToImport, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      user | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const activitiesExtendedWithErrors = await this.extendActivitiesWithErrors({ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      activitiesDto, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      userCurrency, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      userId | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      userId: user.id | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const accounts = (await this.accountService.getAccounts(userId)).map( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const accounts = (await this.accountService.getAccounts(user.id)).map( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      ({ id, name }) => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        return { id, name }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      } | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -345,7 +346,6 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          quantity, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          type, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          unitPrice, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          userId, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          accountId: validatedAccount?.id, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          accountUserId: undefined, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          createdAt: new Date(), | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -374,7 +374,8 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          Account: validatedAccount, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          symbolProfileId: undefined, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          updatedAt: new Date() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          updatedAt: new Date(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          userId: user.id | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (error) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -388,7 +389,6 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          quantity, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          type, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          unitPrice, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          userId, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          accountId: validatedAccount?.id, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          SymbolProfile: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            connectOrCreate: { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -406,7 +406,8 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          updateAccountBalance: false, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          User: { connect: { id: userId } } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          User: { connect: { id: user.id } }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          userId: user.id | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -553,10 +554,12 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  private async validateActivities({ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    activitiesDto, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    maxActivitiesToImport | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    maxActivitiesToImport, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    user | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  }: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    activitiesDto: Partial<CreateOrderDto>[]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    maxActivitiesToImport: number; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    user: UserWithSettings; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  }) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (activitiesDto?.length > maxActivitiesToImport) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      throw new Error(`Too many activities (${maxActivitiesToImport} at most)`); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -583,6 +586,21 @@ export class ImportService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      if ( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        user.subscription.type === 'Basic' | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      ) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        const dataProvider = this.dataProviderService.getDataProvider( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          DataSource[dataSource] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (dataProvider.getDataProviderInfo().isPremium) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          throw new Error( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            `activities.${index}.dataSource ("${dataSource}") is not valid` | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const assetProfile = { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currency, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ...( | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |