taxtank-core 0.33.62 → 0.33.64

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.62",
3
+ "version": "0.33.64",
4
4
  "private": false,
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^17.0.0",
@@ -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,19 @@
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
+ buyDate: Date;
16
+ holdingType: HoldingType;
21
17
  get concession(): string;
22
18
  getCostBase(holding: HoldingTrade): number;
23
19
  /**
@@ -2,7 +2,7 @@ import { User } from '../user';
2
2
  import { HoldingType } from './holding-type';
3
3
  import { AppFile } from '../file';
4
4
  import { AbstractModel } from '../../db/Models';
5
- import { HoldingTradeTypeEnum } from '../../db/Enums';
5
+ import { HoldingTradeTypeEnum, HoldingTypeCategoryEnum } from '../../db/Enums';
6
6
  export declare class HoldingTrade extends AbstractModel {
7
7
  isTaxFree: boolean;
8
8
  quantity: number;
@@ -34,4 +34,12 @@ export declare class HoldingTrade extends AbstractModel {
34
34
  */
35
35
  get growthCoefficient(): number;
36
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;
42
+ get categoryLabel(): string;
43
+ get name(): string;
44
+ get ticker(): string;
37
45
  }
@@ -2,12 +2,16 @@ import { HoldingType as HoldingTypeBase } from '../../../db/Models';
2
2
  import { HoldingType } from '../../../models';
3
3
  import { RestMethod, RestService } from '../rest';
4
4
  import { HoldingTypeCollection } from '../../../collections';
5
+ import { IEventListener } from '../../../interfaces';
5
6
  import * as i0 from "@angular/core";
6
- export declare class HoldingTypeService extends RestService<HoldingTypeBase, HoldingType, HoldingTypeCollection> {
7
+ export declare class HoldingTypeService extends RestService<HoldingTypeBase, HoldingType, HoldingTypeCollection> implements IEventListener {
8
+ protected environment: any;
7
9
  modelClass: typeof HoldingType;
8
10
  collectionClass: typeof HoldingTypeCollection;
9
11
  endpointUri: string;
10
12
  disabledMethods: RestMethod[];
13
+ constructor(environment: any);
14
+ listenEvents(): void;
11
15
  static ɵfac: i0.ɵɵFactoryDeclaration<HoldingTypeService, never>;
12
16
  static ɵprov: i0.ɵɵInjectableDeclaration<HoldingTypeService>;
13
17
  }
@@ -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
- }