From cdaae1074a69224d39af8d40cefd0b58b0adaa31 Mon Sep 17 00:00:00 2001 From: francisco Date: Tue, 2 May 2023 23:22:18 +0200 Subject: [PATCH] update cash balance when adding activity --- CHANGELOG.md | 4 +++ apps/api/src/app/account/account.service.ts | 28 +++++++++++++++++++ apps/api/src/app/import/import.service.ts | 3 +- apps/api/src/app/order/create-order.dto.ts | 5 ++++ .../order/interfaces/activities.interface.ts | 1 + apps/api/src/app/order/order.service.ts | 23 ++++++++++++++- apps/api/src/app/order/update-order.dto.ts | 5 ++++ ...ate-or-update-activity-dialog.component.ts | 7 +++-- .../create-or-update-activity-dialog.html | 7 ++++- ...create-or-update-activity-dialog.module.ts | 2 ++ .../create-or-update-activity-dialog.scss | 4 +++ .../app/services/import-activities.service.ts | 9 ++++-- 12 files changed, 90 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f194b23a..04ae062de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed the missing platform name in the allocations by platform chart on the allocations page +### Added + +- Introduced the option to update cash balance of account when adding one activity + ## 1.264.0 - 2023-05-01 ### Added diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index eb3ad8149..d996ee440 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -172,4 +172,32 @@ export class AccountService { where }); } + + public async updateAccountBalance( + accountId: string, + userId: string, + currency: string, + amount: number + ): Promise { + const account = await this.account({ + id_userId: { + id: accountId, + userId + } + }); + + const data: Prisma.AccountUpdateInput = { + balance: account.balance + amount + }; + const where: Prisma.AccountWhereUniqueInput = { + id_userId: { + id: accountId, + userId + } + }; + return this.prismaService.account.update({ + data, + where + }); + } } diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index c3b8f63b3..64ed3d58f 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -303,7 +303,8 @@ export class ImportService { } } }, - User: { connect: { id: userId } } + User: { connect: { id: userId } }, + updateAccountBalance: false }); } diff --git a/apps/api/src/app/order/create-order.dto.ts b/apps/api/src/app/order/create-order.dto.ts index 33e6f9cc8..e43d1dad4 100644 --- a/apps/api/src/app/order/create-order.dto.ts +++ b/apps/api/src/app/order/create-order.dto.ts @@ -8,6 +8,7 @@ import { import { Transform, TransformFnParams } from 'class-transformer'; import { IsArray, + IsBoolean, IsEnum, IsISO8601, IsNumber, @@ -64,4 +65,8 @@ export class CreateOrderDto { @IsNumber() unitPrice: number; + + @IsBoolean() + @IsOptional() + updateAccountBalance: boolean; } diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/apps/api/src/app/order/interfaces/activities.interface.ts index 31b345b46..64fd01481 100644 --- a/apps/api/src/app/order/interfaces/activities.interface.ts +++ b/apps/api/src/app/order/interfaces/activities.interface.ts @@ -8,4 +8,5 @@ export interface Activity extends OrderWithAccount { feeInBaseCurrency: number; 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 9bc2c6a8e..2fd0065ba 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -74,6 +74,7 @@ export class OrderService { symbol?: string; tags?: Tag[]; userId: string; + updateAccountBalance: boolean; } ): Promise { let Account; @@ -137,6 +138,8 @@ export class OrderService { ]); } + const originalData = Object.assign({}, data); + delete data.accountId; delete data.assetClass; delete data.assetSubClass; @@ -150,10 +153,11 @@ export class OrderService { delete data.symbol; delete data.tags; delete data.userId; + delete data.updateAccountBalance; const orderData: Prisma.OrderCreateInput = data; - return this.prismaService.order.create({ + const order = await this.prismaService.order.create({ data: { ...orderData, Account, @@ -165,6 +169,23 @@ export class OrderService { } } }); + + if (originalData.updateAccountBalance) { + let amount = data.unitPrice * data.quantity + data.fee; + + if (data.type === 'BUY') { + amount = amount * -1; + } + + await this.accountService.updateAccountBalance( + originalData.accountId, + originalData.userId, + originalData.currency, + amount + ); + } + + return order; } public async deleteOrder( diff --git a/apps/api/src/app/order/update-order.dto.ts b/apps/api/src/app/order/update-order.dto.ts index 7c709ea7c..6802c1357 100644 --- a/apps/api/src/app/order/update-order.dto.ts +++ b/apps/api/src/app/order/update-order.dto.ts @@ -8,6 +8,7 @@ import { import { Transform, TransformFnParams } from 'class-transformer'; import { IsArray, + IsBoolean, IsEnum, IsISO8601, IsNumber, @@ -66,4 +67,8 @@ export class UpdateOrderDto { @IsNumber() unitPrice: number; + + @IsBoolean() + @IsOptional() + updateAccountBalance: boolean; } 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 b64fe5481..c0f19641e 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 @@ -139,7 +139,8 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { unitPriceInCustomCurrency: [ this.data.activity?.unitPrice, Validators.required - ] + ], + updateAccountBalance: [false] }); this.activityForm.valueChanges @@ -411,7 +412,9 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { : this.activityForm.controls['searchSymbol'].value.symbol, tags: this.activityForm.controls['tags'].value, type: this.activityForm.controls['type'].value, - unitPrice: this.activityForm.controls['unitPrice'].value + unitPrice: this.activityForm.controls['unitPrice'].value, + updateAccountBalance: + this.activityForm.controls['updateAccountBalance'].value }; if (this.data.activity.id) { 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 4ef9b4487..bf91b1116 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 @@ -18,7 +18,7 @@ -
+
Account @@ -32,6 +32,11 @@
+
+ Update cash balance +