taxtank-core 0.33.60 → 0.33.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +81 -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 +28 -0
- package/esm2022/src/lib/forms/holding/holding-trade/holding-trade.form.mjs +29 -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 +62 -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 +43 -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/esm2022/src/lib/validators/match-sum.validator.mjs +2 -2
- package/fesm2022/taxtank-core.mjs +332 -198
- 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 +22 -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 +37 -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 +19 -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,22 @@
|
|
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
|
+
getPosition(): number;
|
11
|
+
getShares(): this;
|
12
|
+
getCryptos(): this;
|
13
|
+
getOthers(): this;
|
14
|
+
/**
|
15
|
+
* @TODO vik remove, use holding.marketValue instead
|
16
|
+
*/
|
17
|
+
get marketValue(): number;
|
18
|
+
/**
|
19
|
+
* @TODO vik remove, use holding.sharedMarketValue instead
|
20
|
+
*/
|
21
|
+
get sharedMarketValue(): number;
|
22
|
+
}
|
@@ -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,37 @@
|
|
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 } 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
|
+
isPurchase(): boolean;
|
21
|
+
get typeLabel(): string;
|
22
|
+
get sign(): string;
|
23
|
+
/**
|
24
|
+
* Get total purchasing price
|
25
|
+
*/
|
26
|
+
get total(): number;
|
27
|
+
/**
|
28
|
+
* @TODO vik remove
|
29
|
+
*/
|
30
|
+
get marketValue(): number;
|
31
|
+
/**
|
32
|
+
* Get percent difference between current and buy price
|
33
|
+
* @TODO vik/alex no need to pass holdingType, should come from backend
|
34
|
+
*/
|
35
|
+
get growthCoefficient(): number;
|
36
|
+
heldMoreYear(): boolean;
|
37
|
+
}
|
@@ -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,25 @@
|
|
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
|
-
|
29
|
-
/**
|
30
|
-
* Get current market price
|
31
|
-
*/
|
32
|
-
get marketValue(): number;
|
7
|
+
name: string;
|
8
|
+
ticker: string;
|
9
|
+
quantity: number;
|
10
|
+
avgPrice: number;
|
11
|
+
purchaseValue: number;
|
12
|
+
marketValue: number;
|
13
|
+
pnl: number;
|
14
|
+
constructor(trades: HoldingTradeCollection, type: HoldingType);
|
15
|
+
getPurchaseValue(): number;
|
16
|
+
getMarketValue(): number;
|
17
|
+
getAvgPrice(): number;
|
33
18
|
/**
|
34
|
-
*
|
35
|
-
* @TODO vik/alex no need to pass holdingType, should come from backend
|
19
|
+
* profit and loss
|
36
20
|
*/
|
37
|
-
|
38
|
-
|
39
|
-
|
21
|
+
getPnl(): number;
|
22
|
+
getSharedMarketValue(): number;
|
23
|
+
getGrowthCoefficient(): number;
|
24
|
+
getUnrealisedProfit(): number;
|
40
25
|
}
|
@@ -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
|