Browse Source

update cash balance when adding activity

pull/1926/head
francisco 2 years ago
committed by x1c0
parent
commit
cdaae1074a
  1. 4
      CHANGELOG.md
  2. 28
      apps/api/src/app/account/account.service.ts
  3. 3
      apps/api/src/app/import/import.service.ts
  4. 5
      apps/api/src/app/order/create-order.dto.ts
  5. 1
      apps/api/src/app/order/interfaces/activities.interface.ts
  6. 23
      apps/api/src/app/order/order.service.ts
  7. 5
      apps/api/src/app/order/update-order.dto.ts
  8. 7
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
  9. 7
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
  10. 2
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts
  11. 4
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.scss
  12. 9
      apps/client/src/app/services/import-activities.service.ts

4
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

28
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<Account> {
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
});
}
}

3
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
});
}

5
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;
}

1
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;
}

23
apps/api/src/app/order/order.service.ts

@ -74,6 +74,7 @@ export class OrderService {
symbol?: string;
tags?: Tag[];
userId: string;
updateAccountBalance: boolean;
}
): Promise<Order> {
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(

5
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;
}

7
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) {

7
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html

@ -18,7 +18,7 @@
</mat-select>
</mat-form-field>
</div>
<div class="mb-3">
<div>
<mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Account</mat-label>
<mat-select formControlName="accountId">
@ -32,6 +32,11 @@
</mat-select>
</mat-form-field>
</div>
<div class="mb-3 pl-1 w-100 checkbox-wrapper">
<mat-checkbox color="primary" formControlName="updateAccountBalance" i18n
>Update cash balance</mat-checkbox
>
</div>
<div
class="mb-3"
[ngClass]="{ 'd-none': !activityForm.controls['searchSymbol'].hasValidator(Validators.required) }"

2
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts

@ -8,6 +8,7 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSelectModule } from '@angular/material/select';
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
@ -24,6 +25,7 @@ import { CreateOrUpdateActivityDialog } from './create-or-update-activity-dialog
GfValueModule,
MatAutocompleteModule,
MatButtonModule,
MatCheckboxModule,
MatChipsModule,
MatDatepickerModule,
MatDialogModule,

4
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.scss

@ -16,6 +16,10 @@
}
}
}
.checkbox-wrapper {
margin-top: -10px;
}
}
:host-context(.is-dark-theme) {

9
apps/client/src/app/services/import-activities.service.ts

@ -59,7 +59,8 @@ export class ImportActivitiesService {
quantity: this.parseQuantity({ content, index, item }),
symbol: this.parseSymbol({ content, index, item }),
type: this.parseType({ content, index, item }),
unitPrice: this.parseUnitPrice({ content, index, item })
unitPrice: this.parseUnitPrice({ content, index, item }),
updateAccountBalance: false
});
}
@ -126,7 +127,8 @@ export class ImportActivitiesService {
quantity,
SymbolProfile,
type,
unitPrice
unitPrice,
updateAccountBalance
}: Activity): CreateOrderDto {
return {
accountId,
@ -136,7 +138,8 @@ export class ImportActivitiesService {
unitPrice,
currency: SymbolProfile.currency,
date: date.toString(),
symbol: SymbolProfile.symbol
symbol: SymbolProfile.symbol,
updateAccountBalance
};
}

Loading…
Cancel
Save