diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index d996ee440..e06ea69fd 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -173,31 +173,44 @@ export class AccountService { }); } - public async updateAccountBalance( - accountId: string, - userId: string, - currency: string, - amount: number - ): Promise { - const account = await this.account({ + public async updateAccountBalance({ + accountId, + amount, + currency, + date, + userId + }: { + accountId: string; + amount: number; + currency: string; + date: Date; + userId: string; + }): Promise { + const { balance, currency: currencyOfAccount } = await this.account({ id_userId: { - id: accountId, - userId + userId, + id: accountId } }); - const data: Prisma.AccountUpdateInput = { - balance: account.balance + amount - }; - const where: Prisma.AccountWhereUniqueInput = { - id_userId: { - id: accountId, - userId - } - }; + const amountInCurrencyOfAccount = + await this.exchangeRateDataService.toCurrencyAtDate( + amount, + currency, + currencyOfAccount, + date + ); + return this.prismaService.account.update({ - data, - where + data: { + balance: new Big(balance).plus(amountInCurrencyOfAccount).toNumber() + }, + where: { + id_userId: { + userId, + id: accountId + } + } }); } } diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/apps/api/src/app/order/interfaces/activities.interface.ts index 64fd01481..33fe8b40d 100644 --- a/apps/api/src/app/order/interfaces/activities.interface.ts +++ b/apps/api/src/app/order/interfaces/activities.interface.ts @@ -6,7 +6,7 @@ export interface Activities { export interface Activity extends OrderWithAccount { feeInBaseCurrency: number; + updateAccountBalance?: boolean; value: number; valueInBaseCurrency: number; - updateAccountBalance?: boolean; } diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 2fd0065ba..696f5442e 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -73,8 +73,8 @@ export class OrderService { dataSource?: DataSource; symbol?: string; tags?: Tag[]; + updateAccountBalance?: boolean; userId: string; - updateAccountBalance: boolean; } ): Promise { let Account; @@ -90,12 +90,16 @@ export class OrderService { }; } + const accountId = data.accountId; + let currency = data.currency; const tags = data.tags ?? []; + const updateAccountBalance = data.updateAccountBalance ?? false; + const userId = data.userId; if (data.type === 'ITEM') { const assetClass = data.assetClass; const assetSubClass = data.assetSubClass; - const currency = data.SymbolProfile.connectOrCreate.create.currency; + currency = data.SymbolProfile.connectOrCreate.create.currency; const dataSource: DataSource = 'MANUAL'; const id = uuidv4(); const name = data.SymbolProfile.connectOrCreate.create.symbol; @@ -138,8 +142,6 @@ export class OrderService { ]); } - const originalData = Object.assign({}, data); - delete data.accountId; delete data.assetClass; delete data.assetSubClass; @@ -152,8 +154,8 @@ export class OrderService { delete data.dataSource; delete data.symbol; delete data.tags; - delete data.userId; delete data.updateAccountBalance; + delete data.userId; const orderData: Prisma.OrderCreateInput = data; @@ -170,19 +172,23 @@ export class OrderService { } }); - if (originalData.updateAccountBalance) { - let amount = data.unitPrice * data.quantity + data.fee; + if (updateAccountBalance === true) { + let amount = new Big(data.unitPrice) + .mul(data.quantity) + .plus(data.fee) + .toNumber(); if (data.type === 'BUY') { - amount = amount * -1; + amount = new Big(amount).mul(-1).toNumber(); } - await this.accountService.updateAccountBalance( - originalData.accountId, - originalData.userId, - originalData.currency, - amount - ); + await this.accountService.updateAccountBalance({ + accountId, + amount, + currency, + userId, + date: data.date as Date + }); } return order; diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index c0f19641e..4336e9417 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -298,6 +298,8 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { Validators.required ); this.activityForm.controls['searchSymbol'].updateValueAndValidity(); + this.activityForm.controls['updateAccountBalance'].disable(); + this.activityForm.controls['updateAccountBalance'].setValue(false); } else { this.activityForm.controls['accountId'].setValidators( Validators.required @@ -315,6 +317,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { Validators.required ); this.activityForm.controls['searchSymbol'].updateValueAndValidity(); + this.activityForm.controls['updateAccountBalance'].enable(); } this.changeDetectorRef.markForCheck(); diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index bf91b1116..9ad56c907 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -19,7 +19,7 @@
- + Account
-
+
Update cash balanceUpdate Cash Balance