taxtank-core 0.33.60 → 0.33.61
Sign up to get free protection for your applications and to get access to all the features.
- package/esm2022/src/lib/collections/asset-sale.collection.mjs +4 -1
- package/esm2022/src/lib/collections/collection-dictionary.mjs +10 -1
- package/esm2022/src/lib/collections/collection.mjs +1 -1
- package/esm2022/src/lib/collections/holding/holding-sale.collection.mjs +3 -3
- package/esm2022/src/lib/collections/holding/holding-trade.collection.mjs +78 -0
- package/esm2022/src/lib/collections/holding/holding.collection.mjs +19 -54
- package/esm2022/src/lib/collections/holding/index.mjs +3 -2
- package/esm2022/src/lib/db/Enums/holding/holding-trade-type.enum.mjs +6 -0
- package/esm2022/src/lib/db/Enums/holding/holding-type-category.enum.mjs +1 -1
- package/esm2022/src/lib/db/Enums/holding/index.mjs +2 -1
- package/esm2022/src/lib/db/Models/holding/holding-sale.mjs +1 -1
- package/esm2022/src/lib/db/Models/holding/holding-trade-import.mjs +3 -0
- package/esm2022/src/lib/db/Models/holding/holding-trade.mjs +3 -0
- package/esm2022/src/lib/db/Models/holding/index.mjs +2 -2
- package/esm2022/src/lib/forms/abstract.form.mjs +6 -1
- package/esm2022/src/lib/forms/holding/holding-reinvest.form.mjs +14 -14
- package/esm2022/src/lib/forms/holding/holding-sale.form.mjs +3 -2
- package/esm2022/src/lib/forms/holding/holding-trade/holding-trade-filter.form.mjs +25 -0
- package/esm2022/src/lib/forms/holding/holding-trade/holding-trade.form.mjs +30 -0
- package/esm2022/src/lib/forms/holding/holding-trade/index.mjs +3 -0
- package/esm2022/src/lib/forms/holding/holding-trade-import.form.mjs +25 -0
- package/esm2022/src/lib/forms/holding/index.mjs +3 -3
- package/esm2022/src/lib/models/endpoint/endpoints.const.mjs +9 -9
- package/esm2022/src/lib/models/holding/holding-reinvest.mjs +4 -4
- package/esm2022/src/lib/models/holding/holding-sale.mjs +10 -1
- package/esm2022/src/lib/models/holding/holding-trade-import.mjs +16 -0
- package/esm2022/src/lib/models/holding/holding-trade.mjs +77 -0
- package/esm2022/src/lib/models/holding/holding-type-exchange.mjs +4 -1
- package/esm2022/src/lib/models/holding/holding-type.mjs +4 -1
- package/esm2022/src/lib/models/holding/holding.mjs +44 -71
- package/esm2022/src/lib/models/holding/index.mjs +4 -3
- package/esm2022/src/lib/services/account-setup/account-setup.service.mjs +3 -3
- package/esm2022/src/lib/services/http/holding/holding-trade-import/holding-trade-import-messages.enum.mjs +9 -0
- package/esm2022/src/lib/services/http/holding/holding-trade-import/holding-trade-import.service.mjs +37 -0
- package/esm2022/src/lib/services/http/holding/holding-trade-messages.enum.mjs +10 -0
- package/esm2022/src/lib/services/http/holding/holding-trade.service.mjs +44 -0
- package/esm2022/src/lib/services/http/holding/index.mjs +5 -6
- package/fesm2022/taxtank-core.mjs +330 -185
- package/fesm2022/taxtank-core.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/collections/asset-sale.collection.d.ts +3 -0
- package/src/lib/collections/collection-dictionary.d.ts +1 -0
- package/src/lib/collections/holding/holding-sale.collection.d.ts +4 -4
- package/src/lib/collections/holding/holding-trade.collection.d.ts +21 -0
- package/src/lib/collections/holding/holding.collection.d.ts +7 -10
- package/src/lib/collections/holding/index.d.ts +2 -1
- package/src/lib/db/Enums/holding/holding-trade-type.enum.d.ts +4 -0
- package/src/lib/db/Enums/holding/index.d.ts +1 -0
- package/src/lib/db/Models/holding/holding-sale.d.ts +2 -2
- package/src/lib/db/Models/holding/holding-trade-import.d.ts +8 -0
- package/src/lib/db/Models/holding/{holding.d.ts → holding-trade.d.ts} +1 -1
- package/src/lib/db/Models/holding/index.d.ts +1 -1
- package/src/lib/forms/abstract.form.d.ts +2 -0
- package/src/lib/forms/holding/holding-reinvest.form.d.ts +5 -5
- package/src/lib/forms/holding/holding-sale.form.d.ts +2 -2
- package/src/lib/forms/holding/holding-trade/holding-trade-filter.form.d.ts +9 -0
- package/src/lib/forms/holding/holding-trade/holding-trade.form.d.ts +9 -0
- package/src/lib/forms/holding/holding-trade/index.d.ts +2 -0
- package/src/lib/forms/holding/holding-trade-import.form.d.ts +8 -0
- package/src/lib/forms/holding/index.d.ts +2 -2
- package/src/lib/models/holding/holding-reinvest.d.ts +2 -2
- package/src/lib/models/holding/holding-sale.d.ts +16 -4
- package/src/lib/models/holding/holding-trade-import.d.ts +8 -0
- package/src/lib/models/holding/holding-trade.d.ts +41 -0
- package/src/lib/models/holding/holding-type-exchange.d.ts +3 -0
- package/src/lib/models/holding/holding-type.d.ts +3 -0
- package/src/lib/models/holding/holding.d.ts +18 -34
- package/src/lib/models/holding/index.d.ts +3 -2
- package/src/lib/services/account-setup/account-setup.service.d.ts +2 -2
- package/src/lib/services/http/holding/{holding-import/holding-import-messages.enum.d.ts → holding-trade-import/holding-trade-import-messages.enum.d.ts} +1 -1
- package/src/lib/services/http/holding/holding-trade-import/holding-trade-import.service.d.ts +17 -0
- package/src/lib/services/http/holding/{holding-messages.enum.d.ts → holding-trade-messages.enum.d.ts} +1 -1
- package/src/lib/services/http/holding/holding-trade.service.d.ts +20 -0
- package/src/lib/services/http/holding/index.d.ts +4 -5
- package/esm2022/src/lib/db/Models/holding/holding-import.mjs +0 -3
- package/esm2022/src/lib/db/Models/holding/holding.mjs +0 -3
- package/esm2022/src/lib/forms/holding/holding-import.form.mjs +0 -25
- package/esm2022/src/lib/forms/holding/holding.form.mjs +0 -28
- package/esm2022/src/lib/models/holding/holding-import.mjs +0 -16
- package/esm2022/src/lib/services/http/holding/holding-import/holding-import-messages.enum.mjs +0 -9
- package/esm2022/src/lib/services/http/holding/holding-import/holding-import.service.mjs +0 -37
- package/esm2022/src/lib/services/http/holding/holding-messages.enum.mjs +0 -10
- package/esm2022/src/lib/services/http/holding/holding-sale-messages.enum.mjs +0 -8
- package/esm2022/src/lib/services/http/holding/holding.service.mjs +0 -44
- package/src/lib/db/Models/holding/holding-import.d.ts +0 -8
- package/src/lib/forms/holding/holding-import.form.d.ts +0 -8
- package/src/lib/forms/holding/holding.form.d.ts +0 -8
- package/src/lib/models/holding/holding-import.d.ts +0 -8
- package/src/lib/services/http/holding/holding-import/holding-import.service.d.ts +0 -17
- package/src/lib/services/http/holding/holding-sale-messages.enum.d.ts +0 -6
- package/src/lib/services/http/holding/holding.service.d.ts +0 -20
package/package.json
CHANGED
@@ -3,6 +3,9 @@ import { AssetSale } from '../models';
|
|
3
3
|
export declare class AssetSaleCollection extends Collection<AssetSale> {
|
4
4
|
get grossCapitalProfit(): number;
|
5
5
|
get fullExemptionSales(): this;
|
6
|
+
/**
|
7
|
+
* true only for isTaxFree=true
|
8
|
+
*/
|
6
9
|
get fullExemptionGrossCapitalProfit(): number;
|
7
10
|
get halfExemptionGrossCapitalProfit(): number;
|
8
11
|
get noExemptionGrossCapitalProfit(): number;
|
@@ -1,10 +1,10 @@
|
|
1
|
-
import { Dictionary,
|
1
|
+
import { Dictionary, HoldingSale, HoldingTrade } from '../../models';
|
2
2
|
import { ExportableCollection } from '../exportable.collection';
|
3
3
|
import { ExportCell } from '../../models/export/export-cell';
|
4
|
-
import {
|
4
|
+
import { HoldingTradeCollection } from './holding-trade.collection';
|
5
5
|
export declare class HoldingSaleCollection extends ExportableCollection<HoldingSale> {
|
6
|
-
filterByTaxFree(holdings:
|
6
|
+
filterByTaxFree(holdings: HoldingTradeCollection, isTaxFree?: boolean): this;
|
7
7
|
getExportHeader(): string[];
|
8
8
|
getExportFooter(): ExportCell[];
|
9
|
-
getExportBody(holdingsById: Dictionary<
|
9
|
+
getExportBody(holdingsById: Dictionary<HoldingTrade>): ExportCell[][];
|
10
10
|
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { ExportableCollection } from '../exportable.collection';
|
2
|
+
import { HoldingTrade } from '../../models';
|
3
|
+
import { ExportCell } from '../../models/export/export-cell';
|
4
|
+
export declare class HoldingTradeCollection extends ExportableCollection<HoldingTrade> {
|
5
|
+
getExportHeader(): string[];
|
6
|
+
getExportFooter(): ExportCell[];
|
7
|
+
getExportBody(): ExportCell[][];
|
8
|
+
getPurchases(): this;
|
9
|
+
getSales(): this;
|
10
|
+
getShares(): this;
|
11
|
+
getCryptos(): this;
|
12
|
+
getOthers(): this;
|
13
|
+
/**
|
14
|
+
* @TODO vik remove, use holding.marketValue instead
|
15
|
+
*/
|
16
|
+
get marketValue(): number;
|
17
|
+
/**
|
18
|
+
* @TODO vik remove, use holding.sharedMarketValue instead
|
19
|
+
*/
|
20
|
+
get sharedMarketValue(): number;
|
21
|
+
}
|
@@ -1,17 +1,14 @@
|
|
1
|
-
import {
|
1
|
+
import { Collection } from '../collection';
|
2
2
|
import { Holding } from '../../models';
|
3
|
-
import {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
getExportBody(): ExportCell[][];
|
3
|
+
import { HoldingTradeCollection } from './holding-trade.collection';
|
4
|
+
import { HoldingTypeCollection } from './holding-type.collection';
|
5
|
+
export declare class HoldingCollection extends Collection<Holding> {
|
6
|
+
static fromTrades(trades: HoldingTradeCollection, holdingTypes: HoldingTypeCollection): HoldingCollection;
|
8
7
|
getShares(): this;
|
9
8
|
getCryptos(): this;
|
10
9
|
getOthers(): this;
|
11
|
-
getPurchaseValue(): number;
|
12
10
|
get marketValue(): number;
|
13
|
-
get
|
11
|
+
get purchaseValue(): number;
|
14
12
|
getGrowthCoefficient(): number;
|
15
|
-
|
16
|
-
getUnrealisedProfit(): number;
|
13
|
+
getPnl(): number;
|
17
14
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { HoldingTrade } from './holding-trade';
|
2
2
|
import { File } from '../file';
|
3
3
|
export declare class HoldingSale {
|
4
4
|
date?: Date;
|
@@ -10,6 +10,6 @@ export declare class HoldingSale {
|
|
10
10
|
grossCapitalGain?: number;
|
11
11
|
netCapitalGain?: number;
|
12
12
|
id?: number;
|
13
|
-
holding?:
|
13
|
+
holding?: HoldingTrade;
|
14
14
|
file?: File;
|
15
15
|
}
|
@@ -2,7 +2,7 @@ import { User } from '../user/user';
|
|
2
2
|
import { HoldingType } from './holding-type';
|
3
3
|
import { File } from '../file';
|
4
4
|
import { HoldingSale } from './holding-sale';
|
5
|
-
export declare class
|
5
|
+
export declare class HoldingTrade {
|
6
6
|
isTaxFree?: boolean;
|
7
7
|
date?: Date;
|
8
8
|
quantity?: number;
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { AbstractControl, AbstractControlOptions, AsyncValidatorFn, FormGroup, ValidatorFn } from '@angular/forms';
|
2
2
|
import { EventEmitter, Type } from '@angular/core';
|
3
|
+
import { Observable } from 'rxjs';
|
3
4
|
/**
|
4
5
|
* Default Controls Interface with loose typing
|
5
6
|
*/
|
@@ -70,4 +71,5 @@ export declare abstract class AbstractForm<Model, Controls extends ControlsInter
|
|
70
71
|
onlySelf?: boolean;
|
71
72
|
emitEvent?: boolean;
|
72
73
|
}, controls?: AbstractControl[]): void;
|
74
|
+
controlsChanges(controlNames: string[]): Observable<any>;
|
73
75
|
}
|
@@ -9,21 +9,21 @@ export declare class HoldingReinvestForm extends AbstractForm<HoldingReinvest> i
|
|
9
9
|
constructor(reinvest: HoldingReinvest);
|
10
10
|
listenEvents(): void;
|
11
11
|
private get transactionForm();
|
12
|
-
private get
|
12
|
+
private get tradeForm();
|
13
13
|
/**
|
14
14
|
* calculated automatically as cashVariance=transactionAmount-frankedAmount-unfrankedAmount
|
15
15
|
*/
|
16
16
|
private listenAmountChanges;
|
17
17
|
/**
|
18
|
-
* Set transaction amount based on
|
18
|
+
* Set transaction amount based on trade quantity and price
|
19
19
|
*/
|
20
|
-
private
|
20
|
+
private listenTradeChanges;
|
21
21
|
/**
|
22
|
-
* Set
|
22
|
+
* Set trade date the same as transaction date
|
23
23
|
*/
|
24
24
|
private listenDateChanges;
|
25
25
|
/**
|
26
|
-
* @TODO Alex (TT-2847): attach file to both (transaction and
|
26
|
+
* @TODO Alex (TT-2847): attach file to both (transaction and trade) when files system refactored
|
27
27
|
*/
|
28
28
|
submit(): HoldingReinvest;
|
29
29
|
}
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import { IEventListener } from '../../interfaces';
|
2
|
-
import {
|
2
|
+
import { HoldingSale, HoldingTrade, HoldingType } from '../../models';
|
3
3
|
import { AbstractForm } from '../abstract.form';
|
4
4
|
export declare class HoldingSaleForm extends AbstractForm<HoldingSale> implements IEventListener {
|
5
5
|
private holding;
|
6
6
|
private isResident;
|
7
|
-
constructor(sale: HoldingSale, holding:
|
7
|
+
constructor(sale: HoldingSale, holding: HoldingTrade, type: HoldingType, isResident: boolean);
|
8
8
|
listenEvents(): void;
|
9
9
|
submit(): HoldingSale;
|
10
10
|
private updateGainFields;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { HoldingTrade } from '../../../models';
|
2
|
+
import { AbstractForm } from '../../abstract.form';
|
3
|
+
import { HoldingTradeCollection } from '../../../collections';
|
4
|
+
import { HoldingTypeCategoryEnum } from '../../../db/Enums';
|
5
|
+
export declare class HoldingTradeFilterForm extends AbstractForm<HoldingTrade> {
|
6
|
+
categories: HoldingTypeCategoryEnum[];
|
7
|
+
constructor();
|
8
|
+
filter(trades: HoldingTradeCollection): HoldingTradeCollection;
|
9
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { HoldingTrade } from '../../../models';
|
2
|
+
import { AbstractForm } from '../../abstract.form';
|
3
|
+
import { IEventListener } from '../../../interfaces';
|
4
|
+
export declare class HoldingTradeForm extends AbstractForm<HoldingTrade> implements IEventListener {
|
5
|
+
purchaseValue: number;
|
6
|
+
constructor(holdingTrade: HoldingTrade);
|
7
|
+
listenEvents(): void;
|
8
|
+
submit(data?: object, includeDisabledFields?: boolean): HoldingTrade;
|
9
|
+
}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { AbstractForm } from '../abstract.form';
|
2
|
+
import { IEventListener } from '../../interfaces';
|
3
|
+
import { HoldingTradeImport } from '../../models';
|
4
|
+
export declare class HoldingTradeImportForm extends AbstractForm<HoldingTradeImport> implements IEventListener {
|
5
|
+
constructor();
|
6
|
+
listenEvents(): void;
|
7
|
+
submit(): HoldingTradeImport;
|
8
|
+
}
|
@@ -1,5 +1,5 @@
|
|
1
|
+
export * from './holding-trade';
|
1
2
|
export * from './holding-sale.form';
|
2
3
|
export * from './holding-type.form';
|
3
|
-
export * from './holding.form';
|
4
4
|
export * from './holding-reinvest.form';
|
5
|
-
export * from './holding-import.form';
|
5
|
+
export * from './holding-trade-import.form';
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { Transaction } from '../transaction';
|
2
|
-
import {
|
2
|
+
import { HoldingTrade } from './holding-trade';
|
3
3
|
import { AbstractModel } from '../../db/Models';
|
4
4
|
import { HoldingType } from './holding-type';
|
5
5
|
/**
|
@@ -8,6 +8,6 @@ import { HoldingType } from './holding-type';
|
|
8
8
|
*/
|
9
9
|
export declare class HoldingReinvest extends AbstractModel {
|
10
10
|
transaction: Transaction;
|
11
|
-
|
11
|
+
trade: HoldingTrade;
|
12
12
|
holdingType: HoldingType;
|
13
13
|
}
|
@@ -1,23 +1,35 @@
|
|
1
|
-
import {
|
1
|
+
import { HoldingTrade } from './holding-trade';
|
2
2
|
import { AppFile } from '../file';
|
3
3
|
import { AssetSale } from '../asset-sale';
|
4
|
+
/**
|
5
|
+
* @TODO vik rename to HoldingTradeParcel when backend ready
|
6
|
+
*/
|
4
7
|
export declare class HoldingSale extends AssetSale {
|
5
8
|
quantity: number;
|
6
9
|
price: number;
|
7
10
|
fee: number;
|
8
11
|
total: number;
|
9
|
-
|
12
|
+
/**
|
13
|
+
* @TODO vik 4521 remove
|
14
|
+
*/
|
15
|
+
holding?: HoldingTrade;
|
10
16
|
file: AppFile;
|
11
17
|
/**
|
12
18
|
* netCapitalGain is different from grossCapitalGain only when 1 year rule applied
|
13
19
|
*/
|
14
20
|
isOneYearExemptionApplicable(): boolean;
|
15
21
|
get concession(): string;
|
16
|
-
getCostBase(holding:
|
22
|
+
getCostBase(holding: HoldingTrade): number;
|
17
23
|
/**
|
18
24
|
* Purchase price of sold items
|
19
25
|
*/
|
20
|
-
getPurchasePrice(holding:
|
26
|
+
getPurchasePrice(holding: HoldingTrade): number;
|
27
|
+
/**
|
28
|
+
* total price of sale
|
29
|
+
*/
|
21
30
|
get netCost(): number;
|
31
|
+
/**
|
32
|
+
* total price of sale without fee
|
33
|
+
*/
|
22
34
|
get cost(): number;
|
23
35
|
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { User } from '../user';
|
2
|
+
import { HoldingType } from './holding-type';
|
3
|
+
import { AppFile } from '../file';
|
4
|
+
import { AbstractModel } from '../../db/Models';
|
5
|
+
import { HoldingTradeTypeEnum, HoldingTypeCategoryEnum } from '../../db/Enums';
|
6
|
+
export declare class HoldingTrade extends AbstractModel {
|
7
|
+
isTaxFree: boolean;
|
8
|
+
quantity: number;
|
9
|
+
ownershipPercent?: number;
|
10
|
+
price: number;
|
11
|
+
fee: number;
|
12
|
+
type: HoldingTradeTypeEnum;
|
13
|
+
date: Date;
|
14
|
+
user: User;
|
15
|
+
/**
|
16
|
+
* @TODO vik 4521 rename to holding
|
17
|
+
*/
|
18
|
+
holdingType: HoldingType;
|
19
|
+
file: AppFile;
|
20
|
+
/**
|
21
|
+
* @TODO Artem/Alex looks bad, come up with a better solution
|
22
|
+
* get current category, in holding we are interested in 3 main categories: stock/crypto/other
|
23
|
+
*/
|
24
|
+
category: HoldingTypeCategoryEnum;
|
25
|
+
isPurchase(): boolean;
|
26
|
+
get typeLabel(): string;
|
27
|
+
/**
|
28
|
+
* Get total purchasing price
|
29
|
+
*/
|
30
|
+
get total(): number;
|
31
|
+
/**
|
32
|
+
* @TODO vik remove
|
33
|
+
*/
|
34
|
+
get marketValue(): number;
|
35
|
+
/**
|
36
|
+
* Get percent difference between current and buy price
|
37
|
+
* @TODO vik/alex no need to pass holdingType, should come from backend
|
38
|
+
*/
|
39
|
+
get growthCoefficient(): number;
|
40
|
+
heldMoreYear(): boolean;
|
41
|
+
}
|
@@ -1,5 +1,8 @@
|
|
1
1
|
import { AbstractModel } from '../../db/Models';
|
2
2
|
import { HoldingType } from './holding-type';
|
3
|
+
/**
|
4
|
+
* @TODO rename 4521 to HoldingExchange when backend ready
|
5
|
+
*/
|
3
6
|
export declare class HoldingTypeExchange extends AbstractModel {
|
4
7
|
code?: string;
|
5
8
|
name?: string;
|
@@ -3,6 +3,9 @@ import { User } from '../user';
|
|
3
3
|
import { AbstractModel } from '../../db/Models';
|
4
4
|
import { HoldingTypeExchange } from './holding-type-exchange';
|
5
5
|
import { AppFile } from '../file';
|
6
|
+
/**
|
7
|
+
* @TODO vik 4521 rename to Holding when backend ready
|
8
|
+
*/
|
6
9
|
export declare class HoldingType extends AbstractModel {
|
7
10
|
category?: HoldingTypeCategoryEnum;
|
8
11
|
name?: string;
|
@@ -1,40 +1,24 @@
|
|
1
|
-
import { User } from '../user';
|
2
|
-
import { HoldingType } from './holding-type';
|
3
|
-
import { AppFile } from '../file';
|
4
|
-
import { HoldingSale } from './holding-sale';
|
5
|
-
import { Collection } from '../../collections';
|
6
1
|
import { AbstractModel } from '../../db/Models';
|
7
|
-
import {
|
2
|
+
import { HoldingTradeCollection } from '../../collections';
|
3
|
+
import { HoldingType } from './holding-type';
|
8
4
|
export declare class Holding extends AbstractModel {
|
9
|
-
|
10
|
-
quantity: number;
|
11
|
-
currentQuantity: number;
|
12
|
-
ownershipPercent?: number;
|
13
|
-
price: number;
|
14
|
-
fee: number;
|
15
|
-
date: Date;
|
16
|
-
user: User;
|
5
|
+
private trades;
|
17
6
|
type: HoldingType;
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
get purchaseValue(): number;
|
29
|
-
/**
|
30
|
-
* Get current market price
|
31
|
-
*/
|
32
|
-
get marketValue(): number;
|
7
|
+
quantity: number;
|
8
|
+
avgPrice: number;
|
9
|
+
purchaseValue: number;
|
10
|
+
marketValue: number;
|
11
|
+
pnl: number;
|
12
|
+
constructor(trades: HoldingTradeCollection, type: HoldingType);
|
13
|
+
getQuantity(): number;
|
14
|
+
getPurchaseValue(): number;
|
15
|
+
getMarketValue(): number;
|
16
|
+
getAvgPrice(): number;
|
33
17
|
/**
|
34
|
-
*
|
35
|
-
* @TODO vik/alex no need to pass holdingType, should come from backend
|
18
|
+
* profit and loss
|
36
19
|
*/
|
37
|
-
|
38
|
-
|
39
|
-
|
20
|
+
getPnl(): number;
|
21
|
+
getSharedMarketValue(): number;
|
22
|
+
getGrowthCoefficient(): number;
|
23
|
+
getUnrealisedProfit(): number;
|
40
24
|
}
|
@@ -1,6 +1,7 @@
|
|
1
|
-
export * from './holding';
|
1
|
+
export * from './holding-trade';
|
2
2
|
export * from './holding-type';
|
3
3
|
export * from './holding-sale';
|
4
4
|
export * from './holding-type-exchange';
|
5
5
|
export * from './holding-reinvest';
|
6
|
-
export * from './holding-import';
|
6
|
+
export * from './holding-trade-import';
|
7
|
+
export * from './holding';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { BankAccountService, ClientInviteService, ClientMovementService, EmployeeInviteService, EmployeeService, FirmService,
|
1
|
+
import { BankAccountService, ClientInviteService, ClientMovementService, EmployeeInviteService, EmployeeService, FirmService, HoldingTradeService, IncomeSourceService, PropertyService, SoleBusinessService, TransactionAllocationService, TransactionService, UserService, VehicleClaimService } from '../http';
|
2
2
|
import { User } from '../../models';
|
3
3
|
import { AccountSetupItemCollection } from '../../collections';
|
4
4
|
import { Observable } from 'rxjs';
|
@@ -27,7 +27,7 @@ export declare class AccountSetupService {
|
|
27
27
|
private firmService;
|
28
28
|
items: AccountSetupItemCollection;
|
29
29
|
user: User;
|
30
|
-
constructor(setupItemService: SetupItemService, propertyService: PropertyService, incomeSourceService: IncomeSourceService, bankAccountsService: BankAccountService, transactionAllocationService: TransactionAllocationService, vehicleClaimService: VehicleClaimService, transactionService: TransactionService, soleBusinessService: SoleBusinessService, holdingService:
|
30
|
+
constructor(setupItemService: SetupItemService, propertyService: PropertyService, incomeSourceService: IncomeSourceService, bankAccountsService: BankAccountService, transactionAllocationService: TransactionAllocationService, vehicleClaimService: VehicleClaimService, transactionService: TransactionService, soleBusinessService: SoleBusinessService, holdingService: HoldingTradeService, userService: UserService, clientMovementService: ClientMovementService, clientInviteService: ClientInviteService, employeeService: EmployeeService, employeeInviteService: EmployeeInviteService, firmService: FirmService);
|
31
31
|
/**
|
32
32
|
* Get list of account setup items for current user/firm
|
33
33
|
*/
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { RestMethod, RestService } from '../../rest';
|
2
|
+
import { Collection } from '../../../../collections';
|
3
|
+
import { UserRolesEnum } from 'taxtank-core/common';
|
4
|
+
import { HoldingTradeImport as HoldingTradeImportBase } from '../../../../db/Models/holding/holding-trade-import';
|
5
|
+
import { HoldingTradeImport } from '../../../../models';
|
6
|
+
import { Observable } from 'rxjs';
|
7
|
+
import * as i0 from "@angular/core";
|
8
|
+
export declare class HoldingTradeImportService extends RestService<HoldingTradeImportBase, HoldingTradeImport, Collection<HoldingTradeImport>> {
|
9
|
+
modelClass: typeof HoldingTradeImport;
|
10
|
+
collectionClass: typeof Collection<HoldingTradeImport>;
|
11
|
+
endpointUri: string;
|
12
|
+
disabledMethods: RestMethod[];
|
13
|
+
roles: UserRolesEnum[];
|
14
|
+
import(file: File, exchangeId: number, isTaxFree: boolean): Observable<HoldingTradeImport>;
|
15
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HoldingTradeImportService, never>;
|
16
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<HoldingTradeImportService>;
|
17
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { HoldingTrade as HoldingBase } from '../../../db/Models';
|
2
|
+
import { HoldingTrade } from '../../../models';
|
3
|
+
import { RestMethod, RestService } from '../rest';
|
4
|
+
import { HoldingTradeCollection } from '../../../collections';
|
5
|
+
import { IEventListener } from '../../../interfaces';
|
6
|
+
import { UserRolesEnum } from 'taxtank-core/common';
|
7
|
+
import * as i0 from "@angular/core";
|
8
|
+
export declare class HoldingTradeService extends RestService<HoldingBase, HoldingTrade, HoldingTradeCollection> implements IEventListener {
|
9
|
+
protected environment: any;
|
10
|
+
modelClass: typeof HoldingTrade;
|
11
|
+
collectionClass: typeof HoldingTradeCollection;
|
12
|
+
endpointUri: string;
|
13
|
+
disabledMethods: RestMethod[];
|
14
|
+
roles: UserRolesEnum[];
|
15
|
+
constructor(environment: any);
|
16
|
+
listenEvents(): void;
|
17
|
+
private listenNotifications;
|
18
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HoldingTradeService, never>;
|
19
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<HoldingTradeService>;
|
20
|
+
}
|
@@ -1,9 +1,8 @@
|
|
1
|
-
export * from './holding.service';
|
1
|
+
export * from './holding-trade.service';
|
2
2
|
export * from './holding-type.service';
|
3
3
|
export * from './holding-sale.service';
|
4
|
-
export * from './holding-import/holding-import.service';
|
5
|
-
export * from './holding-import/holding-import-messages.enum';
|
4
|
+
export * from './holding-trade-import/holding-trade-import.service';
|
5
|
+
export * from './holding-trade-import/holding-trade-import-messages.enum';
|
6
6
|
export * from '../../json/holding/holding-type-exchange.service';
|
7
|
-
export * from './holding-messages.enum';
|
8
|
-
export * from './holding-sale-messages.enum';
|
7
|
+
export * from './holding-trade-messages.enum';
|
9
8
|
export * from './holding-type-messages.enum';
|
@@ -1,3 +0,0 @@
|
|
1
|
-
export class HoldingImport {
|
2
|
-
}
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9sZGluZy1pbXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dC1jb3JlL3NyYy9saWIvZGIvTW9kZWxzL2hvbGRpbmcvaG9sZGluZy1pbXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLGFBQWE7Q0FNekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIb2xkaW5nIH0gZnJvbSAnLi9ob2xkaW5nJztcblxuZXhwb3J0IGNsYXNzIEhvbGRpbmdJbXBvcnQge1xuICBvcmlnaW5hbE5hbWU/OiBzdHJpbmc7XG4gIGlkPzogbnVtYmVyO1xuICBjcmVhdGVkQXQ/OiBEYXRlO1xuICB1cGRhdGVkQXQ/OiBEYXRlO1xuICBob2xkaW5ncz86IEhvbGRpbmdbXTtcbn1cbiJdfQ==
|
@@ -1,3 +0,0 @@
|
|
1
|
-
export class Holding {
|
2
|
-
}
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9sZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9kYi9Nb2RlbHMvaG9sZGluZy9ob2xkaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE1BQU0sT0FBTyxPQUFPO0NBWW5CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtVc2VyfSBmcm9tICcuLi91c2VyL3VzZXInO1xuaW1wb3J0IHtIb2xkaW5nVHlwZX0gZnJvbSAnLi9ob2xkaW5nLXR5cGUnO1xuaW1wb3J0IHtGaWxlfSBmcm9tICcuLi9maWxlJztcbmltcG9ydCB7SG9sZGluZ1NhbGV9IGZyb20gJy4vaG9sZGluZy1zYWxlJztcblxuZXhwb3J0IGNsYXNzIEhvbGRpbmcge1xuICBpc1RheEZyZWU/OiBib29sZWFuO1xuICBkYXRlPzogRGF0ZTtcbiAgcXVhbnRpdHk/OiBudW1iZXI7XG4gIHByaWNlPzogbnVtYmVyO1xuICBmZWU/OiBudW1iZXI7XG4gIG93bmVyc2hpcFBlcmNlbnQ/OiBudW1iZXI7XG4gIGlkPzogbnVtYmVyO1xuICB1c2VyPzogVXNlcjtcbiAgdHlwZT86IEhvbGRpbmdUeXBlO1xuICBmaWxlPzogRmlsZTtcbiAgc2FsZXM/OiBIb2xkaW5nU2FsZVtdO1xufVxuIl19
|
@@ -1,25 +0,0 @@
|
|
1
|
-
import { UntypedFormControl, Validators } from '@angular/forms';
|
2
|
-
import { AbstractForm } from '../abstract.form';
|
3
|
-
import { HoldingTypeCategoryEnum } from '../../db/Enums';
|
4
|
-
import { HoldingTypeExchangeListEnum } from '../../db/Enums';
|
5
|
-
export class HoldingImportForm extends AbstractForm {
|
6
|
-
constructor() {
|
7
|
-
super({
|
8
|
-
category: new UntypedFormControl(HoldingTypeCategoryEnum.STOCK, Validators.required),
|
9
|
-
exchangeId: new UntypedFormControl(HoldingTypeExchangeListEnum.AU, Validators.required),
|
10
|
-
isTaxFree: new UntypedFormControl(false, Validators.required),
|
11
|
-
file: new UntypedFormControl(null, Validators.required)
|
12
|
-
});
|
13
|
-
this.listenEvents();
|
14
|
-
}
|
15
|
-
listenEvents() {
|
16
|
-
this.get('category').valueChanges.subscribe((category) => {
|
17
|
-
this.get('exchangeId').setValue(category === HoldingTypeCategoryEnum.CRYPTO ? HoldingTypeExchangeListEnum.CC : HoldingTypeExchangeListEnum.AU);
|
18
|
-
});
|
19
|
-
}
|
20
|
-
submit() {
|
21
|
-
// @TODO TypeError: Failed to construct 'File': 2 arguments required, but only 0 present.
|
22
|
-
return super.submit({ file: null });
|
23
|
-
}
|
24
|
-
}
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9sZGluZy1pbXBvcnQuZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9mb3Jtcy9ob2xkaW5nL2hvbGRpbmctaW1wb3J0LmZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc3RCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsWUFBMkI7SUFDaEU7UUFDRSxLQUFLLENBQUM7WUFDSixRQUFRLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNwRixVQUFVLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUN2RixTQUFTLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM3RCxJQUFJLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUN4RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFpQyxFQUFFLEVBQUU7WUFDaEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQzdCLFFBQVEsS0FBSyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUM5RyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTTtRQUNKLHlGQUF5RjtRQUN6RixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBYnN0cmFjdEZvcm0gfSBmcm9tICcuLi9hYnN0cmFjdC5mb3JtJztcbmltcG9ydCB7IElFdmVudExpc3RlbmVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBIb2xkaW5nVHlwZUNhdGVnb3J5RW51bSB9IGZyb20gJy4uLy4uL2RiL0VudW1zJztcbmltcG9ydCB7IEhvbGRpbmdUeXBlRXhjaGFuZ2VMaXN0RW51bSB9IGZyb20gJy4uLy4uL2RiL0VudW1zJztcbmltcG9ydCB7IEhvbGRpbmdJbXBvcnQgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5leHBvcnQgY2xhc3MgSG9sZGluZ0ltcG9ydEZvcm0gZXh0ZW5kcyBBYnN0cmFjdEZvcm08SG9sZGluZ0ltcG9ydD4gaW1wbGVtZW50cyBJRXZlbnRMaXN0ZW5lciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNhdGVnb3J5OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKEhvbGRpbmdUeXBlQ2F0ZWdvcnlFbnVtLlNUT0NLLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGV4Y2hhbmdlSWQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woSG9sZGluZ1R5cGVFeGNoYW5nZUxpc3RFbnVtLkFVLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGlzVGF4RnJlZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChmYWxzZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBmaWxlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgfSk7XG5cbiAgICB0aGlzLmxpc3RlbkV2ZW50cygpO1xuICB9XG5cbiAgbGlzdGVuRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0KCdjYXRlZ29yeScpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGNhdGVnb3J5OiBIb2xkaW5nVHlwZUNhdGVnb3J5RW51bSkgPT4ge1xuICAgICAgdGhpcy5nZXQoJ2V4Y2hhbmdlSWQnKS5zZXRWYWx1ZShcbiAgICAgICAgY2F0ZWdvcnkgPT09IEhvbGRpbmdUeXBlQ2F0ZWdvcnlFbnVtLkNSWVBUTyA/IEhvbGRpbmdUeXBlRXhjaGFuZ2VMaXN0RW51bS5DQyA6IEhvbGRpbmdUeXBlRXhjaGFuZ2VMaXN0RW51bS5BVVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1Ym1pdCgpOiBIb2xkaW5nSW1wb3J0IHtcbiAgICAvLyBAVE9ETyBUeXBlRXJyb3I6IEZhaWxlZCB0byBjb25zdHJ1Y3QgJ0ZpbGUnOiAyIGFyZ3VtZW50cyByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LlxuICAgIHJldHVybiBzdXBlci5zdWJtaXQoeyBmaWxlOiBudWxsIH0pO1xuICB9XG59XG4iXX0=
|
@@ -1,28 +0,0 @@
|
|
1
|
-
import { UntypedFormControl, Validators } from '@angular/forms';
|
2
|
-
import { AbstractForm } from '../abstract.form';
|
3
|
-
import { greaterThanValidator } from '../../validators';
|
4
|
-
export class HoldingForm extends AbstractForm {
|
5
|
-
constructor(holding) {
|
6
|
-
super({
|
7
|
-
category: new UntypedFormControl(holding.category),
|
8
|
-
isTaxFree: new UntypedFormControl(holding.isTaxFree, Validators.required),
|
9
|
-
quantity: new UntypedFormControl(holding.quantity, [Validators.required, greaterThanValidator(0)]),
|
10
|
-
price: new UntypedFormControl(holding.price, [Validators.required, Validators.min(0)]),
|
11
|
-
fee: new UntypedFormControl(holding.fee, [Validators.required, Validators.min(0)]),
|
12
|
-
date: new UntypedFormControl(holding.date, Validators.required),
|
13
|
-
type: new UntypedFormControl(holding.type, Validators.required),
|
14
|
-
ownershipPercent: new UntypedFormControl(holding.ownershipPercent || 100, Validators.required),
|
15
|
-
file: new UntypedFormControl(holding.file)
|
16
|
-
}, holding);
|
17
|
-
this.listenEvents();
|
18
|
-
}
|
19
|
-
listenEvents() {
|
20
|
-
this.get('category').valueChanges.subscribe((category) => {
|
21
|
-
this.get('type').setValue(null);
|
22
|
-
});
|
23
|
-
}
|
24
|
-
submit(data = {}, includeDisabledFields = false) {
|
25
|
-
return super.submit(data, includeDisabledFields);
|
26
|
-
}
|
27
|
-
}
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9sZGluZy5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHQtY29yZS9zcmMvbGliL2Zvcm1zL2hvbGRpbmcvaG9sZGluZy5mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFeEQsTUFBTSxPQUFPLFdBQVksU0FBUSxZQUFxQjtJQUNwRCxZQUNFLE9BQWdCO1FBRWhCLEtBQUssQ0FBQztZQUNKLFFBQVEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDbEQsU0FBUyxFQUFFLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3pFLFFBQVEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEcsS0FBSyxFQUFFLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLEdBQUcsRUFBRSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixJQUFJLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDL0QsSUFBSSxFQUFFLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQy9ELGdCQUFnQixFQUFFLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixJQUFJLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzlGLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7U0FDM0MsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVaLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWlDLEVBQUUsRUFBRTtZQUNoRixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBZSxFQUFFLEVBQUUscUJBQXFCLEdBQUcsS0FBSztRQUNyRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSG9sZGluZyB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBBYnN0cmFjdEZvcm0gfSBmcm9tICcuLi9hYnN0cmFjdC5mb3JtJztcbmltcG9ydCB7IElFdmVudExpc3RlbmVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBIb2xkaW5nVHlwZUNhdGVnb3J5RW51bSB9IGZyb20gJy4uLy4uL2RiL0VudW1zJztcbmltcG9ydCB7IGdyZWF0ZXJUaGFuVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBIb2xkaW5nRm9ybSBleHRlbmRzIEFic3RyYWN0Rm9ybTxIb2xkaW5nPiBpbXBsZW1lbnRzIElFdmVudExpc3RlbmVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgaG9sZGluZzogSG9sZGluZ1xuICApIHtcbiAgICBzdXBlcih7XG4gICAgICBjYXRlZ29yeTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChob2xkaW5nLmNhdGVnb3J5KSxcbiAgICAgIGlzVGF4RnJlZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChob2xkaW5nLmlzVGF4RnJlZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBxdWFudGl0eTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChob2xkaW5nLnF1YW50aXR5LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ3JlYXRlclRoYW5WYWxpZGF0b3IoMCldKSxcbiAgICAgIHByaWNlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGhvbGRpbmcucHJpY2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKV0pLFxuICAgICAgZmVlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGhvbGRpbmcuZmVlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldKSxcbiAgICAgIGRhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woaG9sZGluZy5kYXRlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIHR5cGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woaG9sZGluZy50eXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIG93bmVyc2hpcFBlcmNlbnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woaG9sZGluZy5vd25lcnNoaXBQZXJjZW50IHx8IDEwMCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBmaWxlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGhvbGRpbmcuZmlsZSlcbiAgICB9LCBob2xkaW5nKTtcblxuICAgIHRoaXMubGlzdGVuRXZlbnRzKCk7XG4gIH1cblxuICBsaXN0ZW5FdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5nZXQoJ2NhdGVnb3J5JykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoY2F0ZWdvcnk6IEhvbGRpbmdUeXBlQ2F0ZWdvcnlFbnVtKSA9PiB7XG4gICAgICB0aGlzLmdldCgndHlwZScpLnNldFZhbHVlKG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgc3VibWl0KGRhdGE6IG9iamVjdCA9IHt9LCBpbmNsdWRlRGlzYWJsZWRGaWVsZHMgPSBmYWxzZSk6IEhvbGRpbmcge1xuICAgIHJldHVybiBzdXBlci5zdWJtaXQoZGF0YSwgaW5jbHVkZURpc2FibGVkRmllbGRzKTtcbiAgfVxufVxuIl19
|