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/esm2022/src/lib/collections/holding/holding-sale.collection.mjs +6 -6
- package/esm2022/src/lib/forms/holding/holding-trade/holding-trade.form.mjs +2 -1
- package/esm2022/src/lib/forms/holding/index.mjs +1 -2
- package/esm2022/src/lib/models/holding/holding-sale.mjs +7 -14
- package/esm2022/src/lib/models/holding/holding-trade.mjs +30 -3
- package/esm2022/src/lib/services/http/holding/holding-type.service.mjs +15 -7
- package/esm2022/src/lib/services/http/rest/rest.service.mjs +1 -1
- package/fesm2022/taxtank-core.mjs +52 -70
- package/fesm2022/taxtank-core.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/forms/holding/index.d.ts +0 -1
- package/src/lib/models/holding/holding-sale.d.ts +8 -12
- package/src/lib/models/holding/holding-trade.d.ts +9 -1
- package/src/lib/services/http/holding/holding-type.service.d.ts +5 -1
- package/src/lib/services/http/rest/rest.service.d.ts +1 -1
- package/esm2022/src/lib/forms/holding/holding-sale.form.mjs +0 -53
- package/src/lib/forms/holding/holding-sale.form.d.ts +0 -14
package/package.json
CHANGED
@@ -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
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
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
|
-
}
|