taxtank-core 0.33.61 → 0.33.63

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taxtank-core",
3
- "version": "0.33.61",
3
+ "version": "0.33.63",
4
4
  "private": false,
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^17.0.0",
@@ -7,6 +7,7 @@ export declare class HoldingTradeCollection extends ExportableCollection<Holding
7
7
  getExportBody(): ExportCell[][];
8
8
  getPurchases(): this;
9
9
  getSales(): this;
10
+ getPosition(): number;
10
11
  getShares(): this;
11
12
  getCryptos(): this;
12
13
  getOthers(): this;
@@ -1,5 +1,4 @@
1
1
  export * from './holding-trade';
2
- export * from './holding-sale.form';
3
2
  export * from './holding-type.form';
4
3
  export * from './holding-reinvest.form';
5
4
  export * from './holding-trade-import.form';
@@ -1,23 +1,18 @@
1
1
  import { HoldingTrade } from './holding-trade';
2
- import { AppFile } from '../file';
3
2
  import { AssetSale } from '../asset-sale';
3
+ import { HoldingType } from './holding-type';
4
4
  /**
5
5
  * @TODO vik rename to HoldingTradeParcel when backend ready
6
6
  */
7
7
  export declare class HoldingSale extends AssetSale {
8
8
  quantity: number;
9
9
  price: number;
10
- fee: number;
11
- total: number;
12
- /**
13
- * @TODO vik 4521 remove
14
- */
15
- holding?: HoldingTrade;
16
- file: AppFile;
17
- /**
18
- * netCapitalGain is different from grossCapitalGain only when 1 year rule applied
19
- */
20
- isOneYearExemptionApplicable(): boolean;
10
+ costBase: number;
11
+ marketValue: number;
12
+ isHalfExemption: boolean;
13
+ ownershipPercent: number;
14
+ isTaxFree: boolean;
15
+ holdingType: HoldingType;
21
16
  get concession(): string;
22
17
  getCostBase(holding: HoldingTrade): number;
23
18
  /**
@@ -17,13 +17,9 @@ export declare class HoldingTrade extends AbstractModel {
17
17
  */
18
18
  holdingType: HoldingType;
19
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
20
  isPurchase(): boolean;
26
21
  get typeLabel(): string;
22
+ get sign(): string;
27
23
  /**
28
24
  * Get total purchasing price
29
25
  */
@@ -38,4 +34,9 @@ export declare class HoldingTrade extends AbstractModel {
38
34
  */
39
35
  get growthCoefficient(): number;
40
36
  heldMoreYear(): boolean;
37
+ /**
38
+ * @TODO Artem/Alex looks bad, come up with a better solution
39
+ * get current category, in holding we are interested in 3 main categories: stock/crypto/other
40
+ */
41
+ category: HoldingTypeCategoryEnum;
41
42
  }
@@ -4,13 +4,14 @@ import { HoldingType } from './holding-type';
4
4
  export declare class Holding extends AbstractModel {
5
5
  private trades;
6
6
  type: HoldingType;
7
+ name: string;
8
+ ticker: string;
7
9
  quantity: number;
8
10
  avgPrice: number;
9
11
  purchaseValue: number;
10
12
  marketValue: number;
11
13
  pnl: number;
12
14
  constructor(trades: HoldingTradeCollection, type: HoldingType);
13
- getQuantity(): number;
14
15
  getPurchaseValue(): number;
15
16
  getMarketValue(): number;
16
17
  getAvgPrice(): number;
@@ -69,7 +69,7 @@ export declare abstract class RestService<BaseModel, Model extends AbstractModel
69
69
  /**
70
70
  * Get data from backend and fill the cache
71
71
  */
72
- protected fetch(path?: string): Observable<CollectionModel>;
72
+ fetch(path?: string): Observable<CollectionModel>;
73
73
  get(path?: string): Observable<CollectionModel>;
74
74
  getBy(path: string, values: any): Observable<CollectionModel>;
75
75
  getFirst(): Observable<Model>;
@@ -1,53 +0,0 @@
1
- import { UntypedFormControl, Validators } from '@angular/forms';
2
- import { AbstractForm } from '../abstract.form';
3
- import { combineLatest } from 'rxjs';
4
- import moment from 'moment';
5
- import { greaterThanValidator } from '../../validators';
6
- export class HoldingSaleForm extends AbstractForm {
7
- constructor(sale, holding, type, isResident) {
8
- super({
9
- // @TODO Validators.max(holding.currentQuantity + sale.quantity)
10
- quantity: new UntypedFormControl(sale.quantity, [Validators.required, greaterThanValidator(0)]),
11
- price: new UntypedFormControl(sale.price || type.price, Validators.required),
12
- fee: new UntypedFormControl(sale.fee, Validators.required),
13
- date: new UntypedFormControl(sale.date, Validators.required),
14
- grossCapitalGain: new UntypedFormControl({ value: sale.grossCapitalGain, disabled: true }),
15
- netCapitalGain: new UntypedFormControl({ value: sale.netCapitalGain, disabled: true }),
16
- file: new UntypedFormControl(sale.file)
17
- }, sale);
18
- this.holding = holding;
19
- this.isResident = isResident;
20
- this.listenEvents();
21
- this.emitValues();
22
- }
23
- listenEvents() {
24
- combineLatest(['date', 'price', 'quantity', 'fee'].map((field) => this.get(field).valueChanges))
25
- .subscribe(([date, price, quantity, fee]) => {
26
- this.updateGainFields(date, price, quantity, fee);
27
- });
28
- }
29
- submit() {
30
- return super.submit({}, true);
31
- }
32
- updateGainFields(date, price, quantity, fee) {
33
- const grossCapitalGain = this.calculateGrossCapitalGain(price, quantity, fee);
34
- this.get('grossCapitalGain').setValue(grossCapitalGain);
35
- this.get('netCapitalGain').setValue(this.calculateNetCapitalGain(grossCapitalGain, date));
36
- }
37
- calculateGrossCapitalGain(price, quantity, fee) {
38
- const fees = quantity * this.holding.fee / this.holding.quantity + fee;
39
- const totalCapitalGain = (price - this.holding.price) * quantity - fees;
40
- return totalCapitalGain * this.holding.ownershipPercent / 100;
41
- }
42
- calculateNetCapitalGain(grossCapitalGain, date) {
43
- let netCapitalGain = grossCapitalGain;
44
- if (this.isOneYearExemptionApplicable(netCapitalGain, date)) {
45
- netCapitalGain = netCapitalGain / 2;
46
- }
47
- return netCapitalGain;
48
- }
49
- isOneYearExemptionApplicable(netCapitalGain, date) {
50
- return this.isResident && netCapitalGain > 0 && moment(date).diff(moment(this.holding.date), 'year') > 0;
51
- }
52
- }
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9sZGluZy1zYWxlLmZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dC1jb3JlL3NyYy9saWIvZm9ybXMvaG9sZGluZy9ob2xkaW5nLXNhbGUuZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhELE1BQU0sT0FBTyxlQUFnQixTQUFRLFlBQXlCO0lBQzVELFlBQVksSUFBaUIsRUFBVSxPQUFxQixFQUFFLElBQWlCLEVBQVUsVUFBbUI7UUFDMUcsS0FBSyxDQUFDO1lBQ0osaUVBQWlFO1lBQ2pFLFFBQVEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0YsS0FBSyxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDNUUsR0FBRyxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzFELElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM1RCxnQkFBZ0IsRUFBRSxJQUFJLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFF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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSUV2ZW50TGlzdGVuZXIgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEhvbGRpbmdTYWxlLCBIb2xkaW5nVHJhZGUsIEhvbGRpbmdUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybSB9IGZyb20gJy4uL2Fic3RyYWN0LmZvcm0nO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZ3JlYXRlclRoYW5WYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzJztcblxuZXhwb3J0IGNsYXNzIEhvbGRpbmdTYWxlRm9ybSBleHRlbmRzIEFic3RyYWN0Rm9ybTxIb2xkaW5nU2FsZT4gaW1wbGVtZW50cyBJRXZlbnRMaXN0ZW5lciB7XG4gIGNvbnN0cnVjdG9yKHNhbGU6IEhvbGRpbmdTYWxlLCBwcml2YXRlIGhvbGRpbmc6IEhvbGRpbmdUcmFkZSwgdHlwZTogSG9sZGluZ1R5cGUsIHByaXZhdGUgaXNSZXNpZGVudDogYm9vbGVhbikge1xuICAgIHN1cGVyKHtcbiAgICAgIC8vIEBUT0RPICBWYWxpZGF0b3JzLm1heChob2xkaW5nLmN1cnJlbnRRdWFudGl0eSArIHNhbGUucXVhbnRpdHkpXG4gICAgICBxdWFudGl0eTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChzYWxlLnF1YW50aXR5LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ3JlYXRlclRoYW5WYWxpZGF0b3IoMCldKSxcbiAgICAgIHByaWNlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHNhbGUucHJpY2UgfHwgdHlwZS5wcmljZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBmZWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woc2FsZS5mZWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgZGF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChzYWxlLmRhdGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgZ3Jvc3NDYXBpdGFsR2FpbjogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBzYWxlLmdyb3NzQ2FwaXRhbEdhaW4sIGRpc2FibGVkOiB0cnVlIH0pLFxuICAgICAgbmV0Q2FwaXRhbEdhaW46IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogc2FsZS5uZXRDYXBpdGFsR2FpbiwgZGlzYWJsZWQ6IHRydWUgfSksXG4gICAgICBmaWxlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHNhbGUuZmlsZSlcbiAgICB9LCBzYWxlKTtcblxuICAgIHRoaXMubGlzdGVuRXZlbnRzKCk7XG4gICAgdGhpcy5lbWl0VmFsdWVzKCk7XG4gIH1cblxuICBsaXN0ZW5FdmVudHMoKTogdm9pZCB7XG4gICAgY29tYmluZUxhdGVzdChbJ2RhdGUnLCAncHJpY2UnLCAncXVhbnRpdHknLCAnZmVlJ10ubWFwKChmaWVsZCkgPT4gdGhpcy5nZXQoZmllbGQpLnZhbHVlQ2hhbmdlcykpXG4gICAgICAuc3Vic2NyaWJlKChbZGF0ZSwgcHJpY2UsIHF1YW50aXR5LCBmZWVdKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlR2FpbkZpZWxkcyhkYXRlLCBwcmljZSwgcXVhbnRpdHksIGZlZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHN1Ym1pdCgpOiBIb2xkaW5nU2FsZSB7XG4gICAgcmV0dXJuIHN1cGVyLnN1Ym1pdCh7fSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUdhaW5GaWVsZHMoZGF0ZTogRGF0ZSwgcHJpY2U6IG51bWJlciwgcXVhbnRpdHk6IG51bWJlciwgZmVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBncm9zc0NhcGl0YWxHYWluID0gdGhpcy5jYWxjdWxhdGVHcm9zc0NhcGl0YWxHYWluKHByaWNlLCBxdWFudGl0eSwgZmVlKTtcblxuICAgIHRoaXMuZ2V0KCdncm9zc0NhcGl0YWxHYWluJykuc2V0VmFsdWUoZ3Jvc3NDYXBpdGFsR2Fpbik7XG4gICAgdGhpcy5nZXQoJ25ldENhcGl0YWxHYWluJykuc2V0VmFsdWUodGhpcy5jYWxjdWxhdGVOZXRDYXBpdGFsR2Fpbihncm9zc0NhcGl0YWxHYWluLCBkYXRlKSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUdyb3NzQ2FwaXRhbEdhaW4ocHJpY2U6IG51bWJlciwgcXVhbnRpdHk6IG51bWJlciwgZmVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGZlZXMgPSBxdWFudGl0eSAqIHRoaXMuaG9sZGluZy5mZWUgLyB0aGlzLmhvbGRpbmcucXVhbnRpdHkgKyBmZWU7XG4gICAgY29uc3QgdG90YWxDYXBpdGFsR2FpbiA9IChwcmljZSAtIHRoaXMuaG9sZGluZy5wcmljZSkgKiBxdWFudGl0eSAtIGZlZXM7XG5cbiAgICByZXR1cm4gdG90YWxDYXBpdGFsR2FpbiAqIHRoaXMuaG9sZGluZy5vd25lcnNoaXBQZXJjZW50IC8gMTAwO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVOZXRDYXBpdGFsR2Fpbihncm9zc0NhcGl0YWxHYWluOiBudW1iZXIsIGRhdGU6IERhdGUpOiBudW1iZXIge1xuICAgIGxldCBuZXRDYXBpdGFsR2FpbiA9IGdyb3NzQ2FwaXRhbEdhaW47XG5cbiAgICBpZiAodGhpcy5pc09uZVllYXJFeGVtcHRpb25BcHBsaWNhYmxlKG5ldENhcGl0YWxHYWluLCBkYXRlKSkge1xuICAgICAgbmV0Q2FwaXRhbEdhaW4gPSBuZXRDYXBpdGFsR2FpbiAvIDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldENhcGl0YWxHYWluO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09uZVllYXJFeGVtcHRpb25BcHBsaWNhYmxlKG5ldENhcGl0YWxHYWluOiBudW1iZXIsIGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1Jlc2lkZW50ICYmIG5ldENhcGl0YWxHYWluID4gMCAmJiBtb21lbnQoZGF0ZSkuZGlmZihtb21lbnQodGhpcy5ob2xkaW5nLmRhdGUpLCAneWVhcicpID4gMDtcbiAgfVxufVxuIl19
@@ -1,14 +0,0 @@
1
- import { IEventListener } from '../../interfaces';
2
- import { HoldingSale, HoldingTrade, HoldingType } from '../../models';
3
- import { AbstractForm } from '../abstract.form';
4
- export declare class HoldingSaleForm extends AbstractForm<HoldingSale> implements IEventListener {
5
- private holding;
6
- private isResident;
7
- constructor(sale: HoldingSale, holding: HoldingTrade, type: HoldingType, isResident: boolean);
8
- listenEvents(): void;
9
- submit(): HoldingSale;
10
- private updateGainFields;
11
- private calculateGrossCapitalGain;
12
- private calculateNetCapitalGain;
13
- private isOneYearExemptionApplicable;
14
- }