taxtank-core 0.32.126 → 0.32.128
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/lib/db/Models/incomeSource/income-source-forecast.mjs +1 -1
- package/esm2022/lib/db/Models/incomeSource/salary-forecast.mjs +1 -1
- package/esm2022/lib/db/Models/property/property-forecast.mjs +1 -1
- package/esm2022/lib/db/Models/sole/sole-business-loss.mjs +1 -1
- package/esm2022/lib/db/Models/sole/sole-forecast.mjs +1 -1
- package/esm2022/lib/db/Models/vehicle/vehicle-claim-details.mjs +1 -1
- package/esm2022/lib/models/client/capital-loss.interface.mjs +1 -1
- package/esm2022/lib/models/client/capital-loss.mjs +1 -5
- package/esm2022/lib/models/income-source/salary-forecast.mjs +1 -5
- package/esm2022/lib/models/income-source/sole-forecast.mjs +1 -5
- package/esm2022/lib/models/property/property-forecast.mjs +2 -6
- package/esm2022/lib/models/property/property.mjs +4 -2
- package/esm2022/lib/models/sole/sole-business-loss.mjs +1 -5
- package/fesm2022/taxtank-core.mjs +1079 -1093
- package/fesm2022/taxtank-core.mjs.map +1 -1
- package/lib/db/Models/incomeSource/income-source-forecast.d.ts +1 -1
- package/lib/db/Models/incomeSource/salary-forecast.d.ts +1 -2
- package/lib/db/Models/property/property-forecast.d.ts +1 -2
- package/lib/db/Models/sole/sole-business-loss.d.ts +1 -2
- package/lib/db/Models/sole/sole-forecast.d.ts +1 -2
- package/lib/db/Models/vehicle/vehicle-claim-details.d.ts +1 -1
- package/lib/models/client/capital-loss.d.ts +0 -2
- package/lib/models/client/capital-loss.interface.d.ts +1 -1
- package/lib/models/income-source/salary-forecast.d.ts +0 -2
- package/lib/models/income-source/sole-forecast.d.ts +0 -2
- package/lib/models/property/property-forecast.d.ts +0 -2
- package/lib/models/sole/sole-business-loss.d.ts +0 -2
- package/package.json +1 -1
@@ -20,9 +20,9 @@ import orderBy from 'lodash/orderBy';
|
|
20
20
|
import uniq from 'lodash/uniq';
|
21
21
|
import moment from 'moment';
|
22
22
|
import { DateRange } from 'moment-range';
|
23
|
-
import { Validators, FormGroup, FormArray, UntypedFormControl, UntypedFormArray, UntypedFormGroup, FormControl } from '@angular/forms';
|
24
23
|
import ceil from 'lodash/ceil';
|
25
24
|
import range from 'lodash/range';
|
25
|
+
import { Validators, FormGroup, FormArray, UntypedFormControl, UntypedFormArray, UntypedFormGroup, FormControl } from '@angular/forms';
|
26
26
|
import compact from 'lodash/compact';
|
27
27
|
import concat from 'lodash/concat';
|
28
28
|
import cloneDeep$1 from 'lodash/cloneDeep';
|
@@ -3728,400 +3728,796 @@ var SalaryForecastFrequencyEnum;
|
|
3728
3728
|
SalaryForecastFrequencyEnum[SalaryForecastFrequencyEnum["WEEKLY"] = 52] = "WEEKLY";
|
3729
3729
|
})(SalaryForecastFrequencyEnum || (SalaryForecastFrequencyEnum = {}));
|
3730
3730
|
|
3731
|
-
|
3732
|
-
|
3733
|
-
|
3734
|
-
|
3735
|
-
|
3736
|
-
|
3737
|
-
|
3738
|
-
|
3739
|
-
|
3740
|
-
|
3741
|
-
|
3742
|
-
|
3743
|
-
|
3744
|
-
|
3745
|
-
|
3746
|
-
|
3747
|
-
|
3748
|
-
}
|
3749
|
-
|
3750
|
-
class MyAccountHistory {
|
3731
|
+
class SalaryForecast extends SalaryForecast$1 {
|
3732
|
+
get grossAmount() {
|
3733
|
+
return this.netPay + this.tax;
|
3734
|
+
}
|
3735
|
+
get taxWithheld() {
|
3736
|
+
return this.grossAmount - this.netPay;
|
3737
|
+
}
|
3738
|
+
get monthlyAmount() {
|
3739
|
+
switch (this.frequency) {
|
3740
|
+
case SalaryForecastFrequencyEnum.ANNUAL:
|
3741
|
+
return this.netPay / FinancialYear.monthsInYear;
|
3742
|
+
case SalaryForecastFrequencyEnum.FORTNIGHTLY:
|
3743
|
+
return this.netPay * FinancialYear.weeksInYear / FinancialYear.monthsInYear / 2;
|
3744
|
+
case SalaryForecastFrequencyEnum.WEEKLY:
|
3745
|
+
return this.netPay * FinancialYear.weeksInYear / FinancialYear.monthsInYear;
|
3746
|
+
default:
|
3747
|
+
return this.netPay;
|
3748
|
+
}
|
3749
|
+
}
|
3751
3750
|
}
|
3751
|
+
__decorate([
|
3752
|
+
Type(() => Number)
|
3753
|
+
], SalaryForecast.prototype, "tax", void 0);
|
3754
|
+
__decorate([
|
3755
|
+
Type(() => Number)
|
3756
|
+
], SalaryForecast.prototype, "netPay", void 0);
|
3757
|
+
__decorate([
|
3758
|
+
Type(() => IncomeSource)
|
3759
|
+
], SalaryForecast.prototype, "incomeSource", void 0);
|
3752
3760
|
|
3753
|
-
class
|
3761
|
+
class SoleForecast extends SoleForecast$1 {
|
3762
|
+
get netPay() {
|
3763
|
+
return this.amount;
|
3764
|
+
}
|
3754
3765
|
}
|
3766
|
+
__decorate([
|
3767
|
+
Type(() => IncomeSource)
|
3768
|
+
], SoleForecast.prototype, "incomeSource", void 0);
|
3755
3769
|
|
3756
|
-
var
|
3757
|
-
(function (
|
3758
|
-
|
3759
|
-
|
3760
|
-
|
3761
|
-
|
3762
|
-
|
3763
|
-
|
3764
|
-
|
3765
|
-
|
3766
|
-
|
3767
|
-
|
3768
|
-
|
3769
|
-
|
3770
|
-
UserRolesEnum["HOLDING_TANK"] = "ROLE_USER_HOLDING";
|
3771
|
-
UserRolesEnum["SWITCH_USER"] = "IS_IMPERSONATOR";
|
3772
|
-
})(UserRolesEnum || (UserRolesEnum = {}));
|
3770
|
+
var IncomeSourceForecastTrustTypeEnum;
|
3771
|
+
(function (IncomeSourceForecastTrustTypeEnum) {
|
3772
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["SPECIAL_DISABILITY_TRUST"] = 1] = "SPECIAL_DISABILITY_TRUST";
|
3773
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["DECEASED_ESTATE"] = 2] = "DECEASED_ESTATE";
|
3774
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["FIXED_TRUST"] = 3] = "FIXED_TRUST";
|
3775
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["HYBRID_TRUST"] = 4] = "HYBRID_TRUST";
|
3776
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["DISCRETIONARY_SERVICE_TRUST"] = 5] = "DISCRETIONARY_SERVICE_TRUST";
|
3777
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["DISCRETIONARY_TRADING_TRUST"] = 6] = "DISCRETIONARY_TRADING_TRUST";
|
3778
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["DISCRETIONARY_INVESTMENT_TRUST"] = 7] = "DISCRETIONARY_INVESTMENT_TRUST";
|
3779
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["CASH_MANAGEMENT_UNIT_TRUST"] = 8] = "CASH_MANAGEMENT_UNIT_TRUST";
|
3780
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["PUBLIC_UNIT_TRUST_LISTED"] = 9] = "PUBLIC_UNIT_TRUST_LISTED";
|
3781
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["PUBLIC_UNIT_TRUST_UNLISTED"] = 10] = "PUBLIC_UNIT_TRUST_UNLISTED";
|
3782
|
+
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["TESTAMENTARY_TRUST"] = 11] = "TESTAMENTARY_TRUST";
|
3783
|
+
})(IncomeSourceForecastTrustTypeEnum || (IncomeSourceForecastTrustTypeEnum = {}));
|
3773
3784
|
|
3774
|
-
|
3775
|
-
|
3776
|
-
|
3777
|
-
|
3778
|
-
|
3779
|
-
|
3780
|
-
|
3781
|
-
|
3782
|
-
ROLE_ADVISOR: [UserRolesEnum.ADVISOR],
|
3783
|
-
// @TODO makes no sense, these roles can't be hierarchical
|
3784
|
-
ROLE_CLIENT: [UserRolesEnum.CLIENT],
|
3785
|
-
ROLE_USER_SUBSCRIPTION: [UserRolesEnum.SUBSCRIPTION],
|
3786
|
-
ROLE_USER_WORK: [UserRolesEnum.WORK_TANK],
|
3787
|
-
ROLE_USER_PROPERTY: [UserRolesEnum.PROPERTY_TANK],
|
3788
|
-
ROLE_USER_SOLE: [UserRolesEnum.SOLE_TANK],
|
3789
|
-
ROLE_USER_HOLDING: [UserRolesEnum.HOLDING_TANK],
|
3790
|
-
ROLE_PREVIOUS_ADMIN: [UserRolesEnum.SWITCH_USER],
|
3791
|
-
};
|
3785
|
+
var IncomeSourceTypeListOtherEnum;
|
3786
|
+
(function (IncomeSourceTypeListOtherEnum) {
|
3787
|
+
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["PSI"] = 6] = "PSI";
|
3788
|
+
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["SOLE_TRADER"] = 7] = "SOLE_TRADER";
|
3789
|
+
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["TRUSTS"] = 9] = "TRUSTS";
|
3790
|
+
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["OTHER_INCOME"] = 10] = "OTHER_INCOME";
|
3791
|
+
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["PARTNERSHIPS"] = 12] = "PARTNERSHIPS";
|
3792
|
+
})(IncomeSourceTypeListOtherEnum || (IncomeSourceTypeListOtherEnum = {}));
|
3792
3793
|
|
3793
|
-
|
3794
|
-
|
3795
|
-
|
3796
|
-
|
3797
|
-
}
|
3794
|
+
var IncomeSourceTypeListSoleEnum;
|
3795
|
+
(function (IncomeSourceTypeListSoleEnum) {
|
3796
|
+
IncomeSourceTypeListSoleEnum[IncomeSourceTypeListSoleEnum["SOLE_TRADER"] = 7] = "SOLE_TRADER";
|
3797
|
+
})(IncomeSourceTypeListSoleEnum || (IncomeSourceTypeListSoleEnum = {}));
|
3798
3798
|
|
3799
|
-
|
3800
|
-
|
3801
|
-
[
|
3802
|
-
[
|
3803
|
-
|
3799
|
+
var IncomeSourceTypeListWorkEnum;
|
3800
|
+
(function (IncomeSourceTypeListWorkEnum) {
|
3801
|
+
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["BONUSES"] = 1] = "BONUSES";
|
3802
|
+
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["DIRECTOR_FEES"] = 2] = "DIRECTOR_FEES";
|
3803
|
+
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["INTEREST"] = 4] = "INTEREST";
|
3804
|
+
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["PENSIONS_AND_ALLOWANCES"] = 5] = "PENSIONS_AND_ALLOWANCES";
|
3805
|
+
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["SUPERANNUATION"] = 8] = "SUPERANNUATION";
|
3806
|
+
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["ATTRIBUTED_P_S_I"] = 11] = "ATTRIBUTED_P_S_I";
|
3807
|
+
})(IncomeSourceTypeListWorkEnum || (IncomeSourceTypeListWorkEnum = {}));
|
3804
3808
|
|
3805
|
-
var
|
3806
|
-
(function (
|
3807
|
-
|
3808
|
-
|
3809
|
-
|
3810
|
-
|
3809
|
+
var IncomeSourceTypeListHoldingEnum;
|
3810
|
+
(function (IncomeSourceTypeListHoldingEnum) {
|
3811
|
+
IncomeSourceTypeListHoldingEnum[IncomeSourceTypeListHoldingEnum["DIVIDENDS"] = 3] = "DIVIDENDS";
|
3812
|
+
IncomeSourceTypeListHoldingEnum[IncomeSourceTypeListHoldingEnum["INTEREST"] = 4] = "INTEREST";
|
3813
|
+
IncomeSourceTypeListHoldingEnum[IncomeSourceTypeListHoldingEnum["TRUSTS"] = 9] = "TRUSTS";
|
3814
|
+
IncomeSourceTypeListHoldingEnum[IncomeSourceTypeListHoldingEnum["OTHER_INCOME"] = 10] = "OTHER_INCOME";
|
3815
|
+
IncomeSourceTypeListHoldingEnum[IncomeSourceTypeListHoldingEnum["PARTNERSHIPS"] = 12] = "PARTNERSHIPS";
|
3816
|
+
})(IncomeSourceTypeListHoldingEnum || (IncomeSourceTypeListHoldingEnum = {}));
|
3811
3817
|
|
3812
|
-
class
|
3813
|
-
|
3814
|
-
|
3815
|
-
*/
|
3816
|
-
static { this.consentExpiryReminderDays = 30; }
|
3817
|
-
get taxFileNumberMasked() {
|
3818
|
-
const maskedLength = this.taxFileNumber.length - 4;
|
3819
|
-
const maskedPart = '*'.repeat(maskedLength);
|
3820
|
-
const lastFour = this.taxFileNumber.slice(-4);
|
3821
|
-
return maskedPart + lastFour;
|
3818
|
+
class IncomeSourceType extends IncomeSourceType$1 {
|
3819
|
+
isBonuses() {
|
3820
|
+
return this.id === IncomeSourceTypeListWorkEnum.BONUSES;
|
3822
3821
|
}
|
3823
|
-
|
3824
|
-
|
3825
|
-
return false;
|
3826
|
-
}
|
3827
|
-
const reminderDate = new Date(this.basiqConsentExpiryDate);
|
3828
|
-
reminderDate.setDate(this.basiqConsentExpiryDate.getDate() - ClientDetails.consentExpiryReminderDays);
|
3829
|
-
return new Date() >= reminderDate;
|
3822
|
+
isWork() {
|
3823
|
+
return !!IncomeSourceTypeListWorkEnum[this.id];
|
3830
3824
|
}
|
3831
|
-
|
3832
|
-
return this.
|
3825
|
+
isOther() {
|
3826
|
+
return !!IncomeSourceTypeListOtherEnum[this.id];
|
3827
|
+
}
|
3828
|
+
isHolding() {
|
3829
|
+
return !!IncomeSourceTypeListHoldingEnum[this.id];
|
3830
|
+
}
|
3831
|
+
isSole() {
|
3832
|
+
return !!IncomeSourceTypeListSoleEnum[this.id];
|
3833
3833
|
}
|
3834
3834
|
}
|
3835
|
-
__decorate([
|
3836
|
-
Type(() => Date)
|
3837
|
-
], ClientDetails.prototype, "basiqConsentExpiryDate", void 0);
|
3838
3835
|
|
3839
|
-
class
|
3836
|
+
class IncomeSourceForecast extends IncomeSourceForecast$1 {
|
3840
3837
|
constructor() {
|
3841
3838
|
super(...arguments);
|
3842
|
-
this.
|
3843
|
-
this.
|
3839
|
+
this.paygIncome = 0;
|
3840
|
+
this.frequency = SalaryForecastFrequencyEnum.ANNUAL;
|
3841
|
+
this.isTaxFree = false;
|
3844
3842
|
}
|
3845
|
-
|
3846
|
-
|
3843
|
+
/**
|
3844
|
+
* Sometimes Income source has Salary & Income source forecasts,
|
3845
|
+
* and we need these fields to work with Income source forecasts like with Salary Forecasts
|
3846
|
+
*/
|
3847
|
+
get netPay() {
|
3848
|
+
return this.amount;
|
3847
3849
|
}
|
3848
|
-
|
3849
|
-
|
3850
|
-
|
3851
|
-
|
3852
|
-
|
3853
|
-
var ClientInviteStatusEnum;
|
3854
|
-
(function (ClientInviteStatusEnum) {
|
3855
|
-
ClientInviteStatusEnum[ClientInviteStatusEnum["PENDING"] = 1] = "PENDING";
|
3856
|
-
ClientInviteStatusEnum[ClientInviteStatusEnum["REJECTED"] = 2] = "REJECTED";
|
3857
|
-
})(ClientInviteStatusEnum || (ClientInviteStatusEnum = {}));
|
3858
|
-
|
3859
|
-
var ClientInviteTypeEnum;
|
3860
|
-
(function (ClientInviteTypeEnum) {
|
3861
|
-
ClientInviteTypeEnum[ClientInviteTypeEnum["FROM_CLIENT"] = 1] = "FROM_CLIENT";
|
3862
|
-
ClientInviteTypeEnum[ClientInviteTypeEnum["FROM_EMPLOYEE"] = 2] = "FROM_EMPLOYEE";
|
3863
|
-
})(ClientInviteTypeEnum || (ClientInviteTypeEnum = {}));
|
3864
|
-
|
3865
|
-
class RegistrationInvite extends RegistrationInvite$1 {
|
3866
|
-
get fullName() {
|
3867
|
-
return `${this.firstName} ${this.lastName}`;
|
3850
|
+
get grossAmount() {
|
3851
|
+
return this.amount + this.tax + this.taxInstalments + this.frankingCredits;
|
3852
|
+
}
|
3853
|
+
get monthlyAmount() {
|
3854
|
+
return this.amount / 12;
|
3868
3855
|
}
|
3869
3856
|
}
|
3870
3857
|
__decorate([
|
3871
|
-
Type(() =>
|
3872
|
-
],
|
3858
|
+
Type(() => IncomeSourceType)
|
3859
|
+
], IncomeSourceForecast.prototype, "incomeSourceType", void 0);
|
3873
3860
|
__decorate([
|
3874
|
-
Type(() =>
|
3875
|
-
],
|
3876
|
-
|
3877
|
-
var PhoneTypeEnum;
|
3878
|
-
(function (PhoneTypeEnum) {
|
3879
|
-
PhoneTypeEnum[PhoneTypeEnum["MOBILE"] = 1] = "MOBILE";
|
3880
|
-
PhoneTypeEnum[PhoneTypeEnum["OFFICE"] = 2] = "OFFICE";
|
3881
|
-
})(PhoneTypeEnum || (PhoneTypeEnum = {}));
|
3861
|
+
Type(() => IncomeSource)
|
3862
|
+
], IncomeSourceForecast.prototype, "incomeSource", void 0);
|
3882
3863
|
|
3883
|
-
class
|
3884
|
-
|
3885
|
-
|
3886
|
-
this.country = Country.australia;
|
3887
|
-
this.type = PhoneTypeEnum.MOBILE;
|
3864
|
+
class IncomeSource extends IncomeSource$1 {
|
3865
|
+
isSoleIncome() {
|
3866
|
+
return this.type === IncomeSourceTypeEnum.SOLE;
|
3888
3867
|
}
|
3889
|
-
|
3890
|
-
return
|
3868
|
+
isWorkIncome() {
|
3869
|
+
return this.type === IncomeSourceTypeEnum.WORK;
|
3891
3870
|
}
|
3892
|
-
|
3893
|
-
|
3894
|
-
|
3895
|
-
|
3896
|
-
|
3897
|
-
|
3898
|
-
|
3899
|
-
|
3871
|
+
isOtherIncome() {
|
3872
|
+
return this.type === IncomeSourceTypeEnum.OTHER;
|
3873
|
+
}
|
3874
|
+
isHolding() {
|
3875
|
+
return this.type === IncomeSourceTypeEnum.HOLDING;
|
3876
|
+
}
|
3877
|
+
/**
|
3878
|
+
* Get salary and other income forecasts
|
3879
|
+
*/
|
3880
|
+
get forecasts() {
|
3881
|
+
return [...this.salaryForecasts, ...this.incomeSourceForecasts, ...this.soleForecasts];
|
3882
|
+
}
|
3883
|
+
/**
|
3884
|
+
* Get actual (1st from the list) forecast
|
3885
|
+
*/
|
3886
|
+
get actualForecast() {
|
3887
|
+
return this.forecasts[0];
|
3888
|
+
}
|
3889
|
+
/**
|
3890
|
+
* Check if user was working in month taken by the index
|
3891
|
+
* @param monthIndex by which month should be taken
|
3892
|
+
*/
|
3893
|
+
isWorkedInMonth(monthIndex) {
|
3894
|
+
const monthDate = new FinancialYear().getMonthDate(monthIndex);
|
3895
|
+
return (!this.dateFrom || monthDate >= this.dateFrom) && (!this.dateTo || monthDate < this.dateTo);
|
3900
3896
|
}
|
3901
3897
|
}
|
3902
3898
|
__decorate([
|
3903
|
-
Type(() =>
|
3904
|
-
],
|
3905
|
-
__decorate([
|
3906
|
-
Type(() => Address)
|
3907
|
-
], Firm.prototype, "address", void 0);
|
3908
|
-
__decorate([
|
3909
|
-
Type(() => Phone)
|
3910
|
-
], Firm.prototype, "phone", void 0);
|
3899
|
+
Type(() => SalaryForecast)
|
3900
|
+
], IncomeSource.prototype, "salaryForecasts", void 0);
|
3911
3901
|
__decorate([
|
3912
|
-
Type(() =>
|
3913
|
-
],
|
3914
|
-
|
3915
|
-
class FirmBranch extends AbstractModel {
|
3916
|
-
constructor() {
|
3917
|
-
super(...arguments);
|
3918
|
-
this.isMain = false;
|
3919
|
-
}
|
3920
|
-
}
|
3902
|
+
Type(() => SoleForecast)
|
3903
|
+
], IncomeSource.prototype, "soleForecasts", void 0);
|
3921
3904
|
__decorate([
|
3922
|
-
Type(() =>
|
3923
|
-
],
|
3905
|
+
Type(() => IncomeSourceForecast)
|
3906
|
+
], IncomeSource.prototype, "incomeSourceForecasts", void 0);
|
3924
3907
|
__decorate([
|
3925
|
-
Type(() =>
|
3926
|
-
],
|
3908
|
+
Type(() => Date)
|
3909
|
+
], IncomeSource.prototype, "dateFrom", void 0);
|
3927
3910
|
__decorate([
|
3928
|
-
Type(() =>
|
3929
|
-
],
|
3911
|
+
Type(() => Date)
|
3912
|
+
], IncomeSource.prototype, "dateTo", void 0);
|
3930
3913
|
|
3931
|
-
|
3932
|
-
|
3933
|
-
|
3934
|
-
|
3935
|
-
|
3936
|
-
|
3914
|
+
/**
|
3915
|
+
* Income sources chart data
|
3916
|
+
*/
|
3917
|
+
class IncomeSourceChartData {
|
3918
|
+
constructor(forecastedIncomeAmount, transactions) {
|
3919
|
+
this.forecastedIncomeAmount = forecastedIncomeAmount;
|
3920
|
+
this.transactions = transactions;
|
3937
3921
|
}
|
3938
3922
|
/**
|
3939
|
-
*
|
3923
|
+
* Get prepared data for income sources chart
|
3940
3924
|
*/
|
3941
|
-
|
3942
|
-
|
3925
|
+
get() {
|
3926
|
+
const chartData = [{
|
3927
|
+
id: 'actualIncome',
|
3928
|
+
name: 'Actual Income',
|
3929
|
+
data: [],
|
3930
|
+
// display future actual incomes with dash line and past actual incomes with solid line
|
3931
|
+
zones: [{
|
3932
|
+
// line style after current month
|
3933
|
+
value: new FinancialYear().getMonthDate(new Date().getMonth()).getTime(),
|
3934
|
+
dashStyle: 'Solid'
|
3935
|
+
}, {
|
3936
|
+
// default line style
|
3937
|
+
dashStyle: 'Dash'
|
3938
|
+
}]
|
3939
|
+
}, {
|
3940
|
+
id: 'forecastedIncome',
|
3941
|
+
name: 'Forecasted Income',
|
3942
|
+
data: [],
|
3943
|
+
}];
|
3944
|
+
for (const key in MonthNameShortEnum) {
|
3945
|
+
if (MonthNameShortEnum.hasOwnProperty(key)) {
|
3946
|
+
// transaction collection for provided month
|
3947
|
+
const monthTransactionCollection = this.transactions.getByMonth(+MonthNumberEnum[key]);
|
3948
|
+
chartData[0].data.push([new FinancialYear().getMonthDate(+MonthNumberEnum[key]).getTime(), monthTransactionCollection.amount]);
|
3949
|
+
chartData[1].data.push([new FinancialYear().getMonthDate(+MonthNumberEnum[key]).getTime(), this.forecastedIncomeAmount / 12]);
|
3950
|
+
}
|
3951
|
+
}
|
3952
|
+
return chartData;
|
3943
3953
|
}
|
3944
|
-
|
3945
|
-
|
3946
|
-
|
3947
|
-
|
3948
|
-
|
3954
|
+
}
|
3955
|
+
|
3956
|
+
var TransactionSourceEnum;
|
3957
|
+
(function (TransactionSourceEnum) {
|
3958
|
+
TransactionSourceEnum[TransactionSourceEnum["CASH"] = 1] = "CASH";
|
3959
|
+
TransactionSourceEnum[TransactionSourceEnum["BANK_TRANSACTION"] = 2] = "BANK_TRANSACTION";
|
3960
|
+
})(TransactionSourceEnum || (TransactionSourceEnum = {}));
|
3961
|
+
|
3962
|
+
class AllocationRuleTransaction extends AllocationRuleTransaction$1 {
|
3963
|
+
constructor() {
|
3964
|
+
super(...arguments);
|
3965
|
+
this.claimPercent = 100;
|
3966
|
+
this.tax = 0;
|
3967
|
+
this.amount = null;
|
3968
|
+
}
|
3969
|
+
get amountPercentCoefficient() {
|
3970
|
+
return this.amountPercent ? this.amountPercent / 100 : 1;
|
3971
|
+
}
|
3972
|
+
calculateClaimPercent() {
|
3973
|
+
if (!this.chartAccounts) {
|
3974
|
+
return null;
|
3975
|
+
}
|
3976
|
+
let claimPercent = this.chartAccounts.taxablePercent;
|
3977
|
+
// Property claim (ownership% x shared%) for property expenses, taxable percent for others
|
3978
|
+
if (this.chartAccounts?.isProperty() && this.property) {
|
3979
|
+
if (this.chartAccounts.isPropertyExpense() && this.chartAccounts.id !== ChartAccountsListEnum.PLATFORM_FEES) {
|
3980
|
+
claimPercent *= this.property?.claimCoefficient;
|
3981
|
+
}
|
3982
|
+
}
|
3983
|
+
return claimPercent;
|
3949
3984
|
}
|
3950
3985
|
/**
|
3951
|
-
*
|
3986
|
+
* If rule transaction has amount then split enabled. There is 0 when split disabled
|
3952
3987
|
*/
|
3953
|
-
|
3954
|
-
return this.
|
3988
|
+
isSplit() {
|
3989
|
+
return !!this.amountPercent;
|
3955
3990
|
}
|
3956
3991
|
/**
|
3957
|
-
*
|
3992
|
+
* Create Transaction instance based on passed bank transaction and rule transaction
|
3958
3993
|
*/
|
3959
|
-
|
3960
|
-
|
3961
|
-
|
3962
|
-
|
3963
|
-
|
3964
|
-
|
3965
|
-
|
3966
|
-
|
3967
|
-
|
3968
|
-
|
3969
|
-
|
3994
|
+
toTransaction(bankTransaction = null) {
|
3995
|
+
const transaction = bankTransaction ? bankTransaction.toTransaction(this.isGST) : plainToClass(Transaction, {});
|
3996
|
+
Object.assign(transaction, {
|
3997
|
+
isGST: this.isGST,
|
3998
|
+
tax: this.tax,
|
3999
|
+
claimPercent: this.claimPercent,
|
4000
|
+
chartAccounts: this.chartAccounts,
|
4001
|
+
property: this.property,
|
4002
|
+
loan: this.loan,
|
4003
|
+
incomeSource: this.incomeSource,
|
4004
|
+
metaFields: this.metaFields,
|
4005
|
+
business: this.business,
|
4006
|
+
source: TransactionSourceEnum.BANK_TRANSACTION,
|
4007
|
+
operation: TransactionOperationEnum.ALLOCATE,
|
4008
|
+
transactions: [],
|
4009
|
+
});
|
4010
|
+
// split allocation
|
4011
|
+
if (this.amountPercent) {
|
4012
|
+
transaction.amount = bankTransaction.amount * this.amountPercentCoefficient / this.gstCoefficient;
|
4013
|
+
}
|
4014
|
+
// child transactions inherit most of the fields from parent transaction
|
4015
|
+
this.childTransactions.forEach((childRuleTransaction) => {
|
4016
|
+
const childTransaction = childRuleTransaction.toTransaction();
|
4017
|
+
childTransaction.amount = childRuleTransaction.amount;
|
4018
|
+
childTransaction.setParent(transaction);
|
4019
|
+
transaction.transactions.push(childTransaction);
|
4020
|
+
});
|
4021
|
+
return transaction;
|
3970
4022
|
}
|
3971
4023
|
}
|
3972
4024
|
__decorate([
|
3973
|
-
Type(() =>
|
3974
|
-
|
4025
|
+
Type(() => ChartAccounts)
|
4026
|
+
// @TODO Alex: Create custom decorator for this transform
|
4027
|
+
,
|
4028
|
+
Transform(({ value }) => ({ id: value.id }), { toPlainOnly: true })
|
4029
|
+
], AllocationRuleTransaction.prototype, "chartAccounts", void 0);
|
3975
4030
|
__decorate([
|
3976
|
-
Type(() =>
|
3977
|
-
|
4031
|
+
Type(() => Property),
|
4032
|
+
Transform(({ value }) => value ? { id: value.id } : null, { toPlainOnly: true })
|
4033
|
+
], AllocationRuleTransaction.prototype, "property", void 0);
|
3978
4034
|
__decorate([
|
3979
|
-
Type(() =>
|
3980
|
-
|
4035
|
+
Type(() => Loan),
|
4036
|
+
Transform(({ value }) => value ? { id: value.id } : null, { toPlainOnly: true })
|
4037
|
+
], AllocationRuleTransaction.prototype, "loan", void 0);
|
3981
4038
|
__decorate([
|
3982
|
-
Type(() =>
|
3983
|
-
|
4039
|
+
Type(() => IncomeSource),
|
4040
|
+
Transform(({ value }) => value ? { id: value.id } : null, { toPlainOnly: true })
|
4041
|
+
], AllocationRuleTransaction.prototype, "incomeSource", void 0);
|
3984
4042
|
__decorate([
|
3985
|
-
Type(() =>
|
3986
|
-
|
4043
|
+
Type(() => SoleBusiness),
|
4044
|
+
Transform(({ value }) => value ? { id: value.id } : null, { toPlainOnly: true })
|
4045
|
+
], AllocationRuleTransaction.prototype, "business", void 0);
|
3987
4046
|
__decorate([
|
3988
|
-
Type(() =>
|
3989
|
-
],
|
4047
|
+
Type(() => AllocationRuleTransactionMetaField)
|
4048
|
+
], AllocationRuleTransaction.prototype, "metaFields", void 0);
|
3990
4049
|
__decorate([
|
3991
|
-
Type(() =>
|
3992
|
-
],
|
4050
|
+
Type(() => AllocationRuleTransaction)
|
4051
|
+
], AllocationRuleTransaction.prototype, "parentTransaction", void 0);
|
4052
|
+
__decorate([
|
4053
|
+
Type(() => AllocationRuleTransaction)
|
4054
|
+
], AllocationRuleTransaction.prototype, "childTransactions", void 0);
|
4055
|
+
__decorate([
|
4056
|
+
Type(() => Number)
|
4057
|
+
], AllocationRuleTransaction.prototype, "claimPercent", void 0);
|
4058
|
+
__decorate([
|
4059
|
+
Type(() => Number)
|
4060
|
+
], AllocationRuleTransaction.prototype, "tax", void 0);
|
3993
4061
|
|
3994
|
-
|
3995
|
-
|
3996
|
-
|
4062
|
+
var TransactionTypeEnum;
|
4063
|
+
(function (TransactionTypeEnum) {
|
4064
|
+
TransactionTypeEnum[TransactionTypeEnum["DEBIT"] = 1] = "DEBIT";
|
4065
|
+
TransactionTypeEnum[TransactionTypeEnum["CREDIT"] = 2] = "CREDIT";
|
4066
|
+
})(TransactionTypeEnum || (TransactionTypeEnum = {}));
|
4067
|
+
|
4068
|
+
class TaxExemption extends TaxExemption$1 {
|
4069
|
+
isPartial() {
|
4070
|
+
return [TaxExemptionEnum.INVESTMENT_TO_PPR, TaxExemptionEnum.PPR_TO_INVESTMENT].includes(this.id);
|
3997
4071
|
}
|
3998
4072
|
}
|
3999
|
-
|
4000
|
-
|
4001
|
-
|
4002
|
-
|
4003
|
-
Type(() => User)
|
4004
|
-
], ClientMovement.prototype, "employee", void 0);
|
4073
|
+
|
4074
|
+
class AssetSale extends ObservableModel {
|
4075
|
+
static { this.className = 'AssetSale'; }
|
4076
|
+
}
|
4005
4077
|
__decorate([
|
4006
4078
|
Type(() => Date)
|
4007
|
-
],
|
4079
|
+
], AssetSale.prototype, "date", void 0);
|
4080
|
+
|
4081
|
+
class PropertySale extends AssetSale {
|
4082
|
+
get saleCostsTotalAmount() {
|
4083
|
+
return this.commission + this.legalFees + this.otherCost;
|
4084
|
+
}
|
4085
|
+
/**
|
4086
|
+
* CGT is not applicable for sales with "Principle place of residence" exemption type.
|
4087
|
+
* https://taxtank.atlassian.net/wiki/spaces/TAXTANK/pages/4644110466/Tax+Return+MyTax+-+Online+Form ("Capital gains or losses" section)
|
4088
|
+
*/
|
4089
|
+
isCGTApplicable() {
|
4090
|
+
return this.taxExemption?.id !== TaxExemptionEnum.PPR;
|
4091
|
+
}
|
4092
|
+
get netPrice() {
|
4093
|
+
return this.price - this.saleCostsTotalAmount;
|
4094
|
+
}
|
4095
|
+
}
|
4096
|
+
__decorate([
|
4097
|
+
Type(() => Number)
|
4098
|
+
], PropertySale.prototype, "holdingCosts", void 0);
|
4099
|
+
__decorate([
|
4100
|
+
Type(() => Number)
|
4101
|
+
], PropertySale.prototype, "structuralImprovementsWDV", void 0);
|
4102
|
+
__decorate([
|
4103
|
+
Type(() => Number)
|
4104
|
+
], PropertySale.prototype, "buildingAtCostClaimed", void 0);
|
4105
|
+
__decorate([
|
4106
|
+
Type(() => Number)
|
4107
|
+
], PropertySale.prototype, "price", void 0);
|
4108
|
+
__decorate([
|
4109
|
+
Type(() => Number)
|
4110
|
+
], PropertySale.prototype, "commission", void 0);
|
4111
|
+
__decorate([
|
4112
|
+
Type(() => Number)
|
4113
|
+
], PropertySale.prototype, "legalFees", void 0);
|
4114
|
+
__decorate([
|
4115
|
+
Type(() => Number)
|
4116
|
+
], PropertySale.prototype, "otherCost", void 0);
|
4008
4117
|
__decorate([
|
4009
4118
|
Type(() => Date)
|
4010
|
-
],
|
4119
|
+
], PropertySale.prototype, "settlementDate", void 0);
|
4011
4120
|
__decorate([
|
4012
|
-
Type(() =>
|
4013
|
-
],
|
4121
|
+
Type(() => Date)
|
4122
|
+
], PropertySale.prototype, "date", void 0);
|
4123
|
+
__decorate([
|
4124
|
+
Type(() => TaxExemption)
|
4125
|
+
], PropertySale.prototype, "taxExemption", void 0);
|
4126
|
+
__decorate([
|
4127
|
+
Type(() => PropertySaleTaxExemptionMetaField$1)
|
4128
|
+
], PropertySale.prototype, "taxExemptionMetaFields", void 0);
|
4014
4129
|
|
4015
|
-
|
4016
|
-
|
4017
|
-
|
4018
|
-
|
4019
|
-
|
4130
|
+
var MyAccountHistoryInitiatedByEnum;
|
4131
|
+
(function (MyAccountHistoryInitiatedByEnum) {
|
4132
|
+
MyAccountHistoryInitiatedByEnum[MyAccountHistoryInitiatedByEnum["OWNER"] = 0] = "OWNER";
|
4133
|
+
MyAccountHistoryInitiatedByEnum[MyAccountHistoryInitiatedByEnum["ACCOUNTANT"] = 1] = "ACCOUNTANT";
|
4134
|
+
})(MyAccountHistoryInitiatedByEnum || (MyAccountHistoryInitiatedByEnum = {}));
|
4135
|
+
|
4136
|
+
var MyAccountHistoryStatusEnum;
|
4137
|
+
(function (MyAccountHistoryStatusEnum) {
|
4138
|
+
MyAccountHistoryStatusEnum[MyAccountHistoryStatusEnum["SUCCESS"] = 0] = "SUCCESS";
|
4139
|
+
MyAccountHistoryStatusEnum[MyAccountHistoryStatusEnum["ERROR"] = 1] = "ERROR";
|
4140
|
+
})(MyAccountHistoryStatusEnum || (MyAccountHistoryStatusEnum = {}));
|
4141
|
+
|
4142
|
+
var MyAccountHistoryTypeEnum;
|
4143
|
+
(function (MyAccountHistoryTypeEnum) {
|
4144
|
+
MyAccountHistoryTypeEnum[MyAccountHistoryTypeEnum["REVIEW"] = 0] = "REVIEW";
|
4145
|
+
MyAccountHistoryTypeEnum[MyAccountHistoryTypeEnum["UPGRADE_PLAN"] = 1] = "UPGRADE_PLAN";
|
4146
|
+
MyAccountHistoryTypeEnum[MyAccountHistoryTypeEnum["UPLOAD_DOCUMENT"] = 2] = "UPLOAD_DOCUMENT";
|
4147
|
+
})(MyAccountHistoryTypeEnum || (MyAccountHistoryTypeEnum = {}));
|
4148
|
+
|
4149
|
+
class MyAccountHistory {
|
4020
4150
|
}
|
4021
4151
|
|
4152
|
+
class Occupation extends Occupation$1 {
|
4153
|
+
}
|
4154
|
+
|
4155
|
+
var UserRolesEnum;
|
4156
|
+
(function (UserRolesEnum) {
|
4157
|
+
UserRolesEnum["FIRM_OWNER"] = "ROLE_FIRM_OWNER";
|
4158
|
+
UserRolesEnum["FIRM_MANAGER"] = "ROLE_FIRM_MANAGER";
|
4159
|
+
UserRolesEnum["FIRM_TOP_MANAGER"] = "ROLE_FIRM_TOP_MANAGER";
|
4160
|
+
UserRolesEnum["CLIENT"] = "ROLE_CLIENT";
|
4161
|
+
UserRolesEnum["EMPLOYEE"] = "ROLE_EMPLOYEE";
|
4162
|
+
UserRolesEnum["ACCOUNTANT"] = "ROLE_ACCOUNTANT";
|
4163
|
+
UserRolesEnum["ADVISOR"] = "ROLE_ADVISOR";
|
4164
|
+
UserRolesEnum["USER"] = "ROLE_USER";
|
4165
|
+
UserRolesEnum["SUBSCRIPTION"] = "ROLE_USER_SUBSCRIPTION";
|
4166
|
+
UserRolesEnum["WORK_TANK"] = "ROLE_USER_WORK";
|
4167
|
+
UserRolesEnum["PROPERTY_TANK"] = "ROLE_USER_PROPERTY";
|
4168
|
+
UserRolesEnum["SOLE_TANK"] = "ROLE_USER_SOLE";
|
4169
|
+
UserRolesEnum["HOLDING_TANK"] = "ROLE_USER_HOLDING";
|
4170
|
+
UserRolesEnum["SWITCH_USER"] = "IS_IMPERSONATOR";
|
4171
|
+
})(UserRolesEnum || (UserRolesEnum = {}));
|
4172
|
+
|
4022
4173
|
/**
|
4023
|
-
*
|
4024
|
-
* @TODO consider rename to ChartSerie
|
4174
|
+
* role hierarchy
|
4025
4175
|
*/
|
4026
|
-
|
4027
|
-
|
4028
|
-
|
4029
|
-
|
4030
|
-
|
4176
|
+
const USER_ROLES = {
|
4177
|
+
ROLE_FIRM_OWNER: [UserRolesEnum.FIRM_OWNER, UserRolesEnum.FIRM_MANAGER, UserRolesEnum.ACCOUNTANT, UserRolesEnum.ADVISOR],
|
4178
|
+
ROLE_FIRM_MANAGER: [UserRolesEnum.FIRM_MANAGER, UserRolesEnum.ACCOUNTANT, UserRolesEnum.ADVISOR],
|
4179
|
+
ROLE_EMPLOYEE: [UserRolesEnum.ACCOUNTANT, UserRolesEnum.ADVISOR],
|
4180
|
+
ROLE_ACCOUNTANT: [UserRolesEnum.ACCOUNTANT],
|
4181
|
+
ROLE_ADVISOR: [UserRolesEnum.ADVISOR],
|
4182
|
+
// @TODO makes no sense, these roles can't be hierarchical
|
4183
|
+
ROLE_CLIENT: [UserRolesEnum.CLIENT],
|
4184
|
+
ROLE_USER_SUBSCRIPTION: [UserRolesEnum.SUBSCRIPTION],
|
4185
|
+
ROLE_USER_WORK: [UserRolesEnum.WORK_TANK],
|
4186
|
+
ROLE_USER_PROPERTY: [UserRolesEnum.PROPERTY_TANK],
|
4187
|
+
ROLE_USER_SOLE: [UserRolesEnum.SOLE_TANK],
|
4188
|
+
ROLE_USER_HOLDING: [UserRolesEnum.HOLDING_TANK],
|
4189
|
+
ROLE_PREVIOUS_ADMIN: [UserRolesEnum.SWITCH_USER],
|
4190
|
+
};
|
4031
4191
|
|
4032
4192
|
/**
|
4033
|
-
*
|
4193
|
+
* Class with basic information about registering user
|
4034
4194
|
*/
|
4035
|
-
class
|
4036
|
-
|
4037
|
-
|
4195
|
+
class UserToRegister {
|
4196
|
+
}
|
4197
|
+
|
4198
|
+
const USER_WORK_POSITION = {
|
4199
|
+
[UserRolesEnum.EMPLOYEE]: 'Employee',
|
4200
|
+
[UserRolesEnum.FIRM_MANAGER]: 'Manager',
|
4201
|
+
[UserRolesEnum.FIRM_OWNER]: 'Firm Owner'
|
4202
|
+
};
|
4203
|
+
|
4204
|
+
var UserStatusEnum;
|
4205
|
+
(function (UserStatusEnum) {
|
4206
|
+
UserStatusEnum[UserStatusEnum["INACTIVE"] = 0] = "INACTIVE";
|
4207
|
+
UserStatusEnum[UserStatusEnum["ON_BOARDING"] = 1] = "ON_BOARDING";
|
4208
|
+
UserStatusEnum[UserStatusEnum["ACTIVE"] = 2] = "ACTIVE";
|
4209
|
+
})(UserStatusEnum || (UserStatusEnum = {}));
|
4210
|
+
|
4211
|
+
class ClientDetails extends ClientDetails$1 {
|
4212
|
+
/**
|
4213
|
+
* reminder to sign basiq consent after x days before the expiration
|
4214
|
+
*/
|
4215
|
+
static { this.consentExpiryReminderDays = 30; }
|
4216
|
+
get taxFileNumberMasked() {
|
4217
|
+
const maskedLength = this.taxFileNumber.length - 4;
|
4218
|
+
const maskedPart = '*'.repeat(maskedLength);
|
4219
|
+
const lastFour = this.taxFileNumber.slice(-4);
|
4220
|
+
return maskedPart + lastFour;
|
4038
4221
|
}
|
4039
|
-
|
4040
|
-
|
4041
|
-
|
4042
|
-
|
4043
|
-
|
4222
|
+
isBasiqConsentExpiring() {
|
4223
|
+
if (!this.basiqConsentExpiryDate || this.isBasiqConsentExpired()) {
|
4224
|
+
return false;
|
4225
|
+
}
|
4226
|
+
const reminderDate = new Date(this.basiqConsentExpiryDate);
|
4227
|
+
reminderDate.setDate(this.basiqConsentExpiryDate.getDate() - ClientDetails.consentExpiryReminderDays);
|
4228
|
+
return new Date() >= reminderDate;
|
4044
4229
|
}
|
4045
|
-
|
4046
|
-
return
|
4047
|
-
plainToClass(ChartData, {
|
4048
|
-
name: 'Total',
|
4049
|
-
data: [
|
4050
|
-
{
|
4051
|
-
label: 'Market value',
|
4052
|
-
value: this.clientsPortfolioReportCollection.marketValue
|
4053
|
-
},
|
4054
|
-
{
|
4055
|
-
label: 'Loan balance',
|
4056
|
-
value: this.clientsPortfolioReportCollection.loanBalance
|
4057
|
-
},
|
4058
|
-
{
|
4059
|
-
label: 'Equity position',
|
4060
|
-
value: this.clientsPortfolioReportCollection.equityPosition
|
4061
|
-
}
|
4062
|
-
]
|
4063
|
-
}),
|
4064
|
-
plainToClass(ChartData, {
|
4065
|
-
name: 'Average',
|
4066
|
-
data: [
|
4067
|
-
{
|
4068
|
-
label: 'Market value',
|
4069
|
-
value: this.clientsPortfolioReportCollection.averageMarketValue
|
4070
|
-
},
|
4071
|
-
{
|
4072
|
-
label: 'Loan balance',
|
4073
|
-
value: this.clientsPortfolioReportCollection.averageLoanBalance
|
4074
|
-
},
|
4075
|
-
{
|
4076
|
-
label: 'Equity position',
|
4077
|
-
value: this.clientsPortfolioReportCollection.averageEquityPosition
|
4078
|
-
}
|
4079
|
-
]
|
4080
|
-
})
|
4081
|
-
];
|
4230
|
+
isBasiqConsentExpired() {
|
4231
|
+
return this.basiqConsentExpiryDate && new Date() >= this.basiqConsentExpiryDate;
|
4082
4232
|
}
|
4083
4233
|
}
|
4234
|
+
__decorate([
|
4235
|
+
Type(() => Date)
|
4236
|
+
], ClientDetails.prototype, "basiqConsentExpiryDate", void 0);
|
4084
4237
|
|
4085
|
-
|
4086
|
-
* Class describes client's portfolio report information
|
4087
|
-
*/
|
4088
|
-
class ClientPortfolioReport extends AbstractModel {
|
4089
|
-
}
|
4090
|
-
|
4091
|
-
class CapitalLoss extends AbstractModel {
|
4238
|
+
class AnnualClientDetails extends AbstractModel {
|
4092
4239
|
constructor() {
|
4093
4240
|
super(...arguments);
|
4241
|
+
this.spouseAnnualIncome = 0;
|
4094
4242
|
this.financialYear = new FinancialYear().year;
|
4095
4243
|
}
|
4244
|
+
get spouseMonthlyIncome() {
|
4245
|
+
return this.spouseAnnualIncome / 12;
|
4246
|
+
}
|
4096
4247
|
}
|
4097
4248
|
__decorate([
|
4098
4249
|
Type(() => ClientDetails)
|
4099
|
-
],
|
4100
|
-
__decorate([
|
4101
|
-
Type(() => User)
|
4102
|
-
], CapitalLoss.prototype, "updatedBy", void 0);
|
4250
|
+
], AnnualClientDetails.prototype, "clientDetails", void 0);
|
4103
4251
|
|
4104
|
-
|
4105
|
-
|
4106
|
-
|
4252
|
+
var ClientInviteStatusEnum;
|
4253
|
+
(function (ClientInviteStatusEnum) {
|
4254
|
+
ClientInviteStatusEnum[ClientInviteStatusEnum["PENDING"] = 1] = "PENDING";
|
4255
|
+
ClientInviteStatusEnum[ClientInviteStatusEnum["REJECTED"] = 2] = "REJECTED";
|
4256
|
+
})(ClientInviteStatusEnum || (ClientInviteStatusEnum = {}));
|
4257
|
+
|
4258
|
+
var ClientInviteTypeEnum;
|
4259
|
+
(function (ClientInviteTypeEnum) {
|
4260
|
+
ClientInviteTypeEnum[ClientInviteTypeEnum["FROM_CLIENT"] = 1] = "FROM_CLIENT";
|
4261
|
+
ClientInviteTypeEnum[ClientInviteTypeEnum["FROM_EMPLOYEE"] = 2] = "FROM_EMPLOYEE";
|
4262
|
+
})(ClientInviteTypeEnum || (ClientInviteTypeEnum = {}));
|
4263
|
+
|
4264
|
+
class RegistrationInvite extends RegistrationInvite$1 {
|
4265
|
+
get fullName() {
|
4266
|
+
return `${this.firstName} ${this.lastName}`;
|
4107
4267
|
}
|
4108
4268
|
}
|
4109
4269
|
__decorate([
|
4110
|
-
Type(() =>
|
4111
|
-
],
|
4270
|
+
Type(() => AppFile)
|
4271
|
+
], RegistrationInvite.prototype, "file", void 0);
|
4112
4272
|
__decorate([
|
4113
|
-
Type(() =>
|
4114
|
-
],
|
4115
|
-
|
4116
|
-
var ServiceProductStatusEnum;
|
4117
|
-
(function (ServiceProductStatusEnum) {
|
4118
|
-
ServiceProductStatusEnum[ServiceProductStatusEnum["ARCHIVED"] = 0] = "ARCHIVED";
|
4119
|
-
ServiceProductStatusEnum[ServiceProductStatusEnum["ACTIVE"] = 1] = "ACTIVE";
|
4120
|
-
})(ServiceProductStatusEnum || (ServiceProductStatusEnum = {}));
|
4273
|
+
Type(() => User)
|
4274
|
+
], RegistrationInvite.prototype, "user", void 0);
|
4121
4275
|
|
4122
|
-
var
|
4123
|
-
(function (
|
4124
|
-
|
4276
|
+
var PhoneTypeEnum;
|
4277
|
+
(function (PhoneTypeEnum) {
|
4278
|
+
PhoneTypeEnum[PhoneTypeEnum["MOBILE"] = 1] = "MOBILE";
|
4279
|
+
PhoneTypeEnum[PhoneTypeEnum["OFFICE"] = 2] = "OFFICE";
|
4280
|
+
})(PhoneTypeEnum || (PhoneTypeEnum = {}));
|
4281
|
+
|
4282
|
+
class Phone extends Phone$1 {
|
4283
|
+
constructor() {
|
4284
|
+
super(...arguments);
|
4285
|
+
this.country = Country.australia;
|
4286
|
+
this.type = PhoneTypeEnum.MOBILE;
|
4287
|
+
}
|
4288
|
+
toString() {
|
4289
|
+
return `+${this.country.callingCode} ${this.number}`;
|
4290
|
+
}
|
4291
|
+
}
|
4292
|
+
__decorate([
|
4293
|
+
Type(() => Country)
|
4294
|
+
], Phone.prototype, "country", void 0);
|
4295
|
+
|
4296
|
+
class Firm extends Firm$1 {
|
4297
|
+
isAccountant() {
|
4298
|
+
return this.type === FirmTypeEnum.ACCOUNTANT;
|
4299
|
+
}
|
4300
|
+
}
|
4301
|
+
__decorate([
|
4302
|
+
Type(() => User)
|
4303
|
+
], Firm.prototype, "owner", void 0);
|
4304
|
+
__decorate([
|
4305
|
+
Type(() => Address)
|
4306
|
+
], Firm.prototype, "address", void 0);
|
4307
|
+
__decorate([
|
4308
|
+
Type(() => Phone)
|
4309
|
+
], Firm.prototype, "phone", void 0);
|
4310
|
+
__decorate([
|
4311
|
+
Type(() => AppFile)
|
4312
|
+
], Firm.prototype, "file", void 0);
|
4313
|
+
|
4314
|
+
class FirmBranch extends AbstractModel {
|
4315
|
+
constructor() {
|
4316
|
+
super(...arguments);
|
4317
|
+
this.isMain = false;
|
4318
|
+
}
|
4319
|
+
}
|
4320
|
+
__decorate([
|
4321
|
+
Type(() => Firm)
|
4322
|
+
], FirmBranch.prototype, "firm", void 0);
|
4323
|
+
__decorate([
|
4324
|
+
Type(() => Address)
|
4325
|
+
], FirmBranch.prototype, "address", void 0);
|
4326
|
+
__decorate([
|
4327
|
+
Type(() => Phone)
|
4328
|
+
], FirmBranch.prototype, "phone", void 0);
|
4329
|
+
|
4330
|
+
class ClientInvite extends ClientInvite$1 {
|
4331
|
+
/**
|
4332
|
+
* Check if client invite status is pending
|
4333
|
+
*/
|
4334
|
+
isPending() {
|
4335
|
+
return this.status === ClientInviteStatusEnum.PENDING;
|
4336
|
+
}
|
4337
|
+
/**
|
4338
|
+
* Check if client invite status is accepted
|
4339
|
+
*/
|
4340
|
+
isAccepted() {
|
4341
|
+
return !this.isPending() && !this.isRejected();
|
4342
|
+
}
|
4343
|
+
/**
|
4344
|
+
* Check if client invite status is rejected
|
4345
|
+
*/
|
4346
|
+
isRejected() {
|
4347
|
+
return this.status === ClientInviteStatusEnum.REJECTED;
|
4348
|
+
}
|
4349
|
+
/**
|
4350
|
+
* Check if client invite initiated by firm
|
4351
|
+
*/
|
4352
|
+
isFromEmployee() {
|
4353
|
+
return this.type === ClientInviteTypeEnum.FROM_EMPLOYEE;
|
4354
|
+
}
|
4355
|
+
/**
|
4356
|
+
* Check if client invite initiated by client
|
4357
|
+
*/
|
4358
|
+
isFromClient() {
|
4359
|
+
return this.type === ClientInviteTypeEnum.FROM_CLIENT;
|
4360
|
+
}
|
4361
|
+
get firstName() {
|
4362
|
+
return this.client ? this.client.firstName : this.registrationInvite?.firstName;
|
4363
|
+
}
|
4364
|
+
get fullName() {
|
4365
|
+
return this.client ? this.client.fullName : this.registrationInvite?.fullName;
|
4366
|
+
}
|
4367
|
+
get email() {
|
4368
|
+
return this.client ? this.client.email : this.registrationInvite?.email;
|
4369
|
+
}
|
4370
|
+
}
|
4371
|
+
__decorate([
|
4372
|
+
Type(() => Date)
|
4373
|
+
], ClientInvite.prototype, "sentOn", void 0);
|
4374
|
+
__decorate([
|
4375
|
+
Type(() => Date)
|
4376
|
+
], ClientInvite.prototype, "updatedAt", void 0);
|
4377
|
+
__decorate([
|
4378
|
+
Type(() => User)
|
4379
|
+
], ClientInvite.prototype, "client", void 0);
|
4380
|
+
__decorate([
|
4381
|
+
Type(() => User)
|
4382
|
+
], ClientInvite.prototype, "employee", void 0);
|
4383
|
+
__decorate([
|
4384
|
+
Type(() => RegistrationInvite)
|
4385
|
+
], ClientInvite.prototype, "registrationInvite", void 0);
|
4386
|
+
__decorate([
|
4387
|
+
Type(() => Firm)
|
4388
|
+
], ClientInvite.prototype, "firm", void 0);
|
4389
|
+
__decorate([
|
4390
|
+
Type(() => FirmBranch)
|
4391
|
+
], ClientInvite.prototype, "firmBranch", void 0);
|
4392
|
+
|
4393
|
+
class ClientMovement extends ClientMovement$1 {
|
4394
|
+
get firm() {
|
4395
|
+
return this.firmBranch.firm;
|
4396
|
+
}
|
4397
|
+
}
|
4398
|
+
__decorate([
|
4399
|
+
Type(() => User)
|
4400
|
+
], ClientMovement.prototype, "client", void 0);
|
4401
|
+
__decorate([
|
4402
|
+
Type(() => User)
|
4403
|
+
], ClientMovement.prototype, "employee", void 0);
|
4404
|
+
__decorate([
|
4405
|
+
Type(() => Date)
|
4406
|
+
], ClientMovement.prototype, "dateFrom", void 0);
|
4407
|
+
__decorate([
|
4408
|
+
Type(() => Date)
|
4409
|
+
], ClientMovement.prototype, "dateTo", void 0);
|
4410
|
+
__decorate([
|
4411
|
+
Type(() => FirmBranch)
|
4412
|
+
], ClientMovement.prototype, "firmBranch", void 0);
|
4413
|
+
|
4414
|
+
/**
|
4415
|
+
* Chart serie class: chart data item
|
4416
|
+
* @TODO consider rename to ChartSerieData
|
4417
|
+
*/
|
4418
|
+
class ChartSerie {
|
4419
|
+
}
|
4420
|
+
|
4421
|
+
/**
|
4422
|
+
* Chart data class
|
4423
|
+
* @TODO consider rename to ChartSerie
|
4424
|
+
*/
|
4425
|
+
class ChartData {
|
4426
|
+
}
|
4427
|
+
__decorate([
|
4428
|
+
Type(() => ChartSerie)
|
4429
|
+
], ChartData.prototype, "data", void 0);
|
4430
|
+
|
4431
|
+
/**
|
4432
|
+
* Client portfolio charts data based on ClientPortfolioReportCollection
|
4433
|
+
*/
|
4434
|
+
class ClientPortfolioChartData {
|
4435
|
+
constructor(clientsPortfolioReportCollection) {
|
4436
|
+
this.clientsPortfolioReportCollection = clientsPortfolioReportCollection;
|
4437
|
+
}
|
4438
|
+
getPieChartData() {
|
4439
|
+
return this.clientsPortfolioReportCollection.items.map((clientPortfolioReport) => plainToClass(ChartData, {
|
4440
|
+
name: clientPortfolioReport.category,
|
4441
|
+
data: clientPortfolioReport.count
|
4442
|
+
}));
|
4443
|
+
}
|
4444
|
+
getBarChartData() {
|
4445
|
+
return [
|
4446
|
+
plainToClass(ChartData, {
|
4447
|
+
name: 'Total',
|
4448
|
+
data: [
|
4449
|
+
{
|
4450
|
+
label: 'Market value',
|
4451
|
+
value: this.clientsPortfolioReportCollection.marketValue
|
4452
|
+
},
|
4453
|
+
{
|
4454
|
+
label: 'Loan balance',
|
4455
|
+
value: this.clientsPortfolioReportCollection.loanBalance
|
4456
|
+
},
|
4457
|
+
{
|
4458
|
+
label: 'Equity position',
|
4459
|
+
value: this.clientsPortfolioReportCollection.equityPosition
|
4460
|
+
}
|
4461
|
+
]
|
4462
|
+
}),
|
4463
|
+
plainToClass(ChartData, {
|
4464
|
+
name: 'Average',
|
4465
|
+
data: [
|
4466
|
+
{
|
4467
|
+
label: 'Market value',
|
4468
|
+
value: this.clientsPortfolioReportCollection.averageMarketValue
|
4469
|
+
},
|
4470
|
+
{
|
4471
|
+
label: 'Loan balance',
|
4472
|
+
value: this.clientsPortfolioReportCollection.averageLoanBalance
|
4473
|
+
},
|
4474
|
+
{
|
4475
|
+
label: 'Equity position',
|
4476
|
+
value: this.clientsPortfolioReportCollection.averageEquityPosition
|
4477
|
+
}
|
4478
|
+
]
|
4479
|
+
})
|
4480
|
+
];
|
4481
|
+
}
|
4482
|
+
}
|
4483
|
+
|
4484
|
+
/**
|
4485
|
+
* Class describes client's portfolio report information
|
4486
|
+
*/
|
4487
|
+
class ClientPortfolioReport extends AbstractModel {
|
4488
|
+
}
|
4489
|
+
|
4490
|
+
class CapitalLoss extends AbstractModel {
|
4491
|
+
constructor() {
|
4492
|
+
super(...arguments);
|
4493
|
+
this.financialYear = new FinancialYear().year;
|
4494
|
+
}
|
4495
|
+
}
|
4496
|
+
__decorate([
|
4497
|
+
Type(() => ClientDetails)
|
4498
|
+
], CapitalLoss.prototype, "clientDetails", void 0);
|
4499
|
+
|
4500
|
+
class EmployeeDetails extends EmployeeDetails$1 {
|
4501
|
+
get firmBranchNames() {
|
4502
|
+
return this.firmBranches.map(branch => branch.name).join(', ');
|
4503
|
+
}
|
4504
|
+
}
|
4505
|
+
__decorate([
|
4506
|
+
Type(() => Firm)
|
4507
|
+
], EmployeeDetails.prototype, "firm", void 0);
|
4508
|
+
__decorate([
|
4509
|
+
Type(() => FirmBranch)
|
4510
|
+
], EmployeeDetails.prototype, "firmBranches", void 0);
|
4511
|
+
|
4512
|
+
var ServiceProductStatusEnum;
|
4513
|
+
(function (ServiceProductStatusEnum) {
|
4514
|
+
ServiceProductStatusEnum[ServiceProductStatusEnum["ARCHIVED"] = 0] = "ARCHIVED";
|
4515
|
+
ServiceProductStatusEnum[ServiceProductStatusEnum["ACTIVE"] = 1] = "ACTIVE";
|
4516
|
+
})(ServiceProductStatusEnum || (ServiceProductStatusEnum = {}));
|
4517
|
+
|
4518
|
+
var ServiceProductIdEnum;
|
4519
|
+
(function (ServiceProductIdEnum) {
|
4520
|
+
ServiceProductIdEnum[ServiceProductIdEnum["WORK_TANK_OLD"] = 1] = "WORK_TANK_OLD";
|
4125
4521
|
ServiceProductIdEnum[ServiceProductIdEnum["PROPERTY_OLD"] = 2] = "PROPERTY_OLD";
|
4126
4522
|
ServiceProductIdEnum[ServiceProductIdEnum["PROPERTY_TANK"] = 3] = "PROPERTY_TANK";
|
4127
4523
|
ServiceProductIdEnum[ServiceProductIdEnum["WORK_TANK"] = 4] = "WORK_TANK";
|
@@ -4536,15 +4932,6 @@ __decorate([
|
|
4536
4932
|
__decorate([
|
4537
4933
|
Type(() => SoleBusinessLossOffsetRule)
|
4538
4934
|
], SoleBusinessLoss.prototype, "offsetRule", void 0);
|
4539
|
-
__decorate([
|
4540
|
-
Type(() => User)
|
4541
|
-
], SoleBusinessLoss.prototype, "updatedBy", void 0);
|
4542
|
-
|
4543
|
-
var TransactionSourceEnum;
|
4544
|
-
(function (TransactionSourceEnum) {
|
4545
|
-
TransactionSourceEnum[TransactionSourceEnum["CASH"] = 1] = "CASH";
|
4546
|
-
TransactionSourceEnum[TransactionSourceEnum["BANK_TRANSACTION"] = 2] = "BANK_TRANSACTION";
|
4547
|
-
})(TransactionSourceEnum || (TransactionSourceEnum = {}));
|
4548
4935
|
|
4549
4936
|
var SoleInvoiceTaxTypeEnum;
|
4550
4937
|
(function (SoleInvoiceTaxTypeEnum) {
|
@@ -4828,871 +5215,472 @@ class VehicleClaimDetails extends VehicleClaimDetails$1 {
|
|
4828
5215
|
this.financialYear = new FinancialYear().year;
|
4829
5216
|
}
|
4830
5217
|
isLogbookMethod() {
|
4831
|
-
return this.method === VehicleClaimDetailsMethodEnum.LOGBOOK;
|
4832
|
-
}
|
4833
|
-
isKmsMethod() {
|
4834
|
-
return this.method === VehicleClaimDetailsMethodEnum.KMS;
|
4835
|
-
}
|
4836
|
-
}
|
4837
|
-
__decorate([
|
4838
|
-
Type(() => User)
|
4839
|
-
], VehicleClaimDetails.prototype, "user", void 0);
|
4840
|
-
|
4841
|
-
class VehicleClaim extends VehicleClaim$1 {
|
4842
|
-
constructor() {
|
4843
|
-
super(...arguments);
|
4844
|
-
this.kilometers = 0;
|
4845
|
-
this.workUsage = 0;
|
4846
|
-
}
|
4847
|
-
/**
|
4848
|
-
* limit for kms claim method
|
4849
|
-
*/
|
4850
|
-
static { this.totalKmsLimit = 5000; }
|
4851
|
-
/**
|
4852
|
-
* limit for work usage claim method
|
4853
|
-
*/
|
4854
|
-
static { this.totalWorkUsagePercent = 100; }
|
4855
|
-
isWorkTank() {
|
4856
|
-
return !this.business;
|
4857
|
-
}
|
4858
|
-
isSoleTank() {
|
4859
|
-
return !!this.business;
|
4860
|
-
}
|
4861
|
-
get tankType() {
|
4862
|
-
return this.isSoleTank() ? TankTypeEnum.SOLE : TankTypeEnum.WORK;
|
4863
|
-
}
|
4864
|
-
/**
|
4865
|
-
* Claim amount for KMs method. Exists only for KMs method.
|
4866
|
-
*/
|
4867
|
-
getKMSClaimAmount(vehicleClaimRate) {
|
4868
|
-
return round(this.kilometers * vehicleClaimRate, 2);
|
4869
|
-
}
|
4870
|
-
/**
|
4871
|
-
* Get logbook claim amount. Exists only for logbook method.
|
4872
|
-
* ClaimAmount = WorkUsage * transaction/depreciation amount
|
4873
|
-
*/
|
4874
|
-
getLogbookClaimAmount(transactions) {
|
4875
|
-
const transactionsAmount = transactions
|
4876
|
-
.getByVehicleClaim(this)
|
4877
|
-
.getLogbookTransactions()
|
4878
|
-
.sumBy('amount');
|
4879
|
-
// Math.abs because amount will be negative (because we sum expenses), but we don't want negative percent value
|
4880
|
-
return Math.abs(transactionsAmount) * this.workUsage / 100;
|
4881
|
-
}
|
4882
|
-
getAverageWeeklyKMS() {
|
4883
|
-
return this.kilometers / FinancialYear.weeksInYear;
|
4884
|
-
}
|
4885
|
-
}
|
4886
|
-
__decorate([
|
4887
|
-
Type(() => VehicleClaimDetails)
|
4888
|
-
], VehicleClaim.prototype, "details", void 0);
|
4889
|
-
__decorate([
|
4890
|
-
Type(() => SoleBusiness)
|
4891
|
-
], VehicleClaim.prototype, "business", void 0);
|
4892
|
-
|
4893
|
-
/**
|
4894
|
-
* Depreciation Nested Tree node with depreciations group
|
4895
|
-
*/
|
4896
|
-
class DepreciationGroup {
|
4897
|
-
constructor(label, description, icon, children, totalCost, openingValue) {
|
4898
|
-
this.label = label;
|
4899
|
-
this.description = description;
|
4900
|
-
this.icon = icon;
|
4901
|
-
this.children = children;
|
4902
|
-
this.totalCost = totalCost;
|
4903
|
-
this.openingValue = openingValue;
|
4904
|
-
}
|
4905
|
-
getClaimAmount() {
|
4906
|
-
return this.children.reduce((sum, child) => sum + child.getClaimAmount(), 0);
|
4907
|
-
}
|
4908
|
-
getAmount() {
|
4909
|
-
return this.children.reduce((sum, child) => sum + child.getAmount(), 0);
|
4910
|
-
}
|
4911
|
-
}
|
4912
|
-
|
4913
|
-
/**
|
4914
|
-
* @TODO Alex useless class, use parent instead
|
4915
|
-
* Depreciation Tree node with depreciation details
|
4916
|
-
*/
|
4917
|
-
class DepreciationGroupItem extends DepreciationGroup {
|
4918
|
-
constructor(depreciation) {
|
4919
|
-
super(depreciation.chartAccounts.name, depreciation.description, 'property');
|
4920
|
-
this.depreciation = depreciation;
|
4921
|
-
}
|
4922
|
-
getClaimAmount() {
|
4923
|
-
return this.depreciation.currentYearForecast.claimAmount;
|
4924
|
-
}
|
4925
|
-
getAmount() {
|
4926
|
-
return this.depreciation.currentYearForecast.amount;
|
4927
|
-
}
|
4928
|
-
}
|
4929
|
-
|
4930
|
-
var DepreciationGroupEnum;
|
4931
|
-
(function (DepreciationGroupEnum) {
|
4932
|
-
DepreciationGroupEnum[DepreciationGroupEnum["BUILDING_IMPROVEMENTS"] = 0] = "BUILDING_IMPROVEMENTS";
|
4933
|
-
DepreciationGroupEnum[DepreciationGroupEnum["PLANT_EQUIPMENT"] = 1] = "PLANT_EQUIPMENT";
|
4934
|
-
DepreciationGroupEnum[DepreciationGroupEnum["LOW_VALUE_POOL"] = 2] = "LOW_VALUE_POOL";
|
4935
|
-
DepreciationGroupEnum[DepreciationGroupEnum["WRITTEN_OFF_ITEMS"] = 3] = "WRITTEN_OFF_ITEMS";
|
4936
|
-
DepreciationGroupEnum[DepreciationGroupEnum["BORROWING_EXPENSES"] = 4] = "BORROWING_EXPENSES";
|
4937
|
-
DepreciationGroupEnum[DepreciationGroupEnum["SMALL_BUSINESS_POOL"] = 5] = "SMALL_BUSINESS_POOL";
|
4938
|
-
})(DepreciationGroupEnum || (DepreciationGroupEnum = {}));
|
4939
|
-
|
4940
|
-
const DEPRECIATION_GROUPS = {
|
4941
|
-
[DepreciationGroupEnum.BORROWING_EXPENSES]: {
|
4942
|
-
label: 'Borrowing Expenses',
|
4943
|
-
description: 'Borrowing expenses on loans are deductible over 1826 days (5 years) starting from the date of a loan',
|
4944
|
-
icon: 'loan'
|
4945
|
-
},
|
4946
|
-
[DepreciationGroupEnum.BUILDING_IMPROVEMENTS]: {
|
4947
|
-
label: 'Building & Improvements',
|
4948
|
-
description: 'Construction costs, renovations and capital improvements which depreciate at 2.5%',
|
4949
|
-
icon: 'building-improvements'
|
4950
|
-
},
|
4951
|
-
[DepreciationGroupEnum.PLANT_EQUIPMENT]: {
|
4952
|
-
label: 'Plant & Equipment',
|
4953
|
-
description: 'Assets which decline in value over their useful life (as prescribed by the ATO)',
|
4954
|
-
icon: 'plant-equipment'
|
4955
|
-
},
|
4956
|
-
[DepreciationGroupEnum.LOW_VALUE_POOL]: {
|
4957
|
-
label: 'Low Value Pool',
|
4958
|
-
description: 'Items under $1,000 are added to the pool to maximise depreciation',
|
4959
|
-
icon: 'lvp'
|
4960
|
-
},
|
4961
|
-
[DepreciationGroupEnum.WRITTEN_OFF_ITEMS]: {
|
4962
|
-
label: 'Written Off Items',
|
4963
|
-
description: 'Items below $300, replaced or obsolete are fully deductible',
|
4964
|
-
icon: 'cart'
|
4965
|
-
},
|
4966
|
-
[DepreciationGroupEnum.SMALL_BUSINESS_POOL]: {
|
4967
|
-
label: 'Small business pool',
|
4968
|
-
description: 'The small business pool allows business owners to claim depreciation on plant and equipment items at an accelerated rate.',
|
4969
|
-
icon: 'portfolio'
|
4970
|
-
},
|
4971
|
-
};
|
4972
|
-
|
4973
|
-
/**
|
4974
|
-
* Depreciation Low Value Pool rate based on asset financial year (current or subsequent years).
|
4975
|
-
*/
|
4976
|
-
var DepreciationLvpRateEnum;
|
4977
|
-
(function (DepreciationLvpRateEnum) {
|
4978
|
-
DepreciationLvpRateEnum[DepreciationLvpRateEnum["FIRST_YEAR"] = 0.1875] = "FIRST_YEAR";
|
4979
|
-
DepreciationLvpRateEnum[DepreciationLvpRateEnum["DEFAULT"] = 0.375] = "DEFAULT";
|
4980
|
-
})(DepreciationLvpRateEnum || (DepreciationLvpRateEnum = {}));
|
4981
|
-
|
4982
|
-
class SoleBusiness extends SoleBusiness$1 {
|
4983
|
-
/**
|
4984
|
-
* Maximum number of businesses that a person can have, according to the ATO
|
4985
|
-
*/
|
4986
|
-
static { this.businessesLimit = 6; }
|
4987
|
-
}
|
4988
|
-
__decorate([
|
4989
|
-
Type(() => User)
|
4990
|
-
], SoleBusiness.prototype, "user", void 0);
|
4991
|
-
__decorate([
|
4992
|
-
Type(() => SoleBusinessAllocation)
|
4993
|
-
], SoleBusiness.prototype, "allocations", void 0);
|
4994
|
-
__decorate([
|
4995
|
-
Type(() => SoleBusinessLoss)
|
4996
|
-
], SoleBusiness.prototype, "losses", void 0);
|
4997
|
-
__decorate([
|
4998
|
-
Type(() => SoleInvoice)
|
4999
|
-
], SoleBusiness.prototype, "invoices", void 0);
|
5000
|
-
__decorate([
|
5001
|
-
Type(() => SoleInvoiceTemplate)
|
5002
|
-
], SoleBusiness.prototype, "invoiceTemplates", void 0);
|
5003
|
-
__decorate([
|
5004
|
-
Type(() => VehicleClaim)
|
5005
|
-
], SoleBusiness.prototype, "vehicleClaims", void 0);
|
5006
|
-
__decorate([
|
5007
|
-
Type(() => Transaction)
|
5008
|
-
], SoleBusiness.prototype, "transactions", void 0);
|
5009
|
-
__decorate([
|
5010
|
-
Type(() => Depreciation)
|
5011
|
-
], SoleBusiness.prototype, "depreciations", void 0);
|
5012
|
-
__decorate([
|
5013
|
-
Type(() => SoleBusinessActivity$1)
|
5014
|
-
], SoleBusiness.prototype, "activity", void 0);
|
5015
|
-
__decorate([
|
5016
|
-
Type(() => IncomeSource)
|
5017
|
-
], SoleBusiness.prototype, "incomeSource", void 0);
|
5018
|
-
__decorate([
|
5019
|
-
Transform(({ value }) => value || false)
|
5020
|
-
], SoleBusiness.prototype, "isPrimaryProduction", void 0);
|
5021
|
-
__decorate([
|
5022
|
-
Type(() => AppFile)
|
5023
|
-
], SoleBusiness.prototype, "file", void 0);
|
5024
|
-
|
5025
|
-
class SoleBusinessActivity extends SoleBusinessActivity$1 {
|
5026
|
-
}
|
5027
|
-
|
5028
|
-
var SoleDepreciationMethodEnum;
|
5029
|
-
(function (SoleDepreciationMethodEnum) {
|
5030
|
-
SoleDepreciationMethodEnum[SoleDepreciationMethodEnum["SBP"] = 1] = "SBP";
|
5031
|
-
SoleDepreciationMethodEnum[SoleDepreciationMethodEnum["DEPRECIATION"] = 2] = "DEPRECIATION";
|
5032
|
-
})(SoleDepreciationMethodEnum || (SoleDepreciationMethodEnum = {}));
|
5033
|
-
|
5034
|
-
class SoleDepreciationMethod extends SoleDepreciationMethod$1 {
|
5035
|
-
isSBP() {
|
5036
|
-
return this.method === SoleDepreciationMethodEnum.SBP;
|
5037
|
-
}
|
5038
|
-
}
|
5039
|
-
|
5040
|
-
class SoleDetails extends SoleDetails$1 {
|
5041
|
-
}
|
5042
|
-
__decorate([
|
5043
|
-
Type(() => User)
|
5044
|
-
], SoleDetails.prototype, "user", void 0);
|
5045
|
-
|
5046
|
-
class BasReport extends BasReport$1 {
|
5047
|
-
get taxWithheldTotal() {
|
5048
|
-
return this.taxWithheldSalary + this.taxWithheldNoABN;
|
5049
|
-
}
|
5050
|
-
get paygTaxInstalmentOwedToATO() {
|
5051
|
-
return this.paygTaxInstalment > 0 ? this.paygTaxInstalment : 0;
|
5052
|
-
}
|
5053
|
-
get paygTaxInstalmentOwedByATO() {
|
5054
|
-
return this.paygTaxInstalment < 0 ? Math.abs(this.paygTaxInstalment) : 0;
|
5055
|
-
}
|
5056
|
-
get fuelTaxCreditOwedToATO() {
|
5057
|
-
return this.fuelTaxCredit < 0 ? this.fuelTaxCredit : 0;
|
5058
|
-
}
|
5059
|
-
get fuelTaxCreditOwedByATO() {
|
5060
|
-
return this.fuelTaxCredit > 0 ? Math.abs(this.fuelTaxCredit) : 0;
|
5061
|
-
}
|
5062
|
-
get owesToATO() {
|
5063
|
-
return this.incomeGST + this.taxWithheldTotal + this.paygTaxInstalmentOwedToATO + this.fuelTaxCreditOwedToATO;
|
5064
|
-
}
|
5065
|
-
get owedByATO() {
|
5066
|
-
return this.expenseGST + this.paygTaxInstalmentOwedByATO + this.fuelTaxCreditOwedByATO;
|
5067
|
-
}
|
5068
|
-
/**
|
5069
|
-
* GST payable to the ATO, or refundable from the ATO in case it's negative
|
5070
|
-
*/
|
5071
|
-
get gst() {
|
5072
|
-
if (!this.id) {
|
5073
|
-
return 0;
|
5074
|
-
}
|
5075
|
-
return this.incomeGST + this.expenseGST + this.taxWithheldTotal + this.paygTaxInstalment - this.fuelTaxCredit;
|
5076
|
-
}
|
5077
|
-
}
|
5078
|
-
__decorate([
|
5079
|
-
Type(() => Date)
|
5080
|
-
], BasReport.prototype, "dateFrom", void 0);
|
5081
|
-
__decorate([
|
5082
|
-
Type(() => Date)
|
5083
|
-
], BasReport.prototype, "dateTo", void 0);
|
5084
|
-
|
5085
|
-
class SetupItem extends AbstractModel {
|
5086
|
-
}
|
5087
|
-
|
5088
|
-
/**
|
5089
|
-
* Enum list of all possible account setup items ids. Using with [ACCOUNT_SETUP_ITEMS]{@link ACCOUNT_SETUP_ITEMS}
|
5090
|
-
* @TODO Vik/Nikita: Do we need to generate it from backend? If some ids changed?
|
5091
|
-
*/
|
5092
|
-
var AccountSetupItemsEnum;
|
5093
|
-
(function (AccountSetupItemsEnum) {
|
5094
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["SALARY"] = 1] = "SALARY";
|
5095
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["OTHER_INCOME"] = 2] = "OTHER_INCOME";
|
5096
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["PROPERTY"] = 3] = "PROPERTY";
|
5097
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["BANK_FEEDS"] = 4] = "BANK_FEEDS";
|
5098
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["WORK_LOGBOOK"] = 5] = "WORK_LOGBOOK";
|
5099
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["TRANSACTION_ALLOCATE"] = 6] = "TRANSACTION_ALLOCATE";
|
5100
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["SOLE_BUSINESS"] = 7] = "SOLE_BUSINESS";
|
5101
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["HOLDINGS"] = 8] = "HOLDINGS";
|
5102
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["FIRM_DETAILS"] = 9] = "FIRM_DETAILS";
|
5103
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["INVITE_TEAM"] = 10] = "INVITE_TEAM";
|
5104
|
-
AccountSetupItemsEnum[AccountSetupItemsEnum["INVITE_CLIENTS"] = 11] = "INVITE_CLIENTS";
|
5105
|
-
})(AccountSetupItemsEnum || (AccountSetupItemsEnum = {}));
|
5106
|
-
|
5107
|
-
class AccountSetupItem extends SetupItem {
|
5108
|
-
get isSalary() {
|
5109
|
-
return this.id === AccountSetupItemsEnum.SALARY;
|
5110
|
-
}
|
5111
|
-
get isOtherIncome() {
|
5112
|
-
return this.id === AccountSetupItemsEnum.OTHER_INCOME;
|
5113
|
-
}
|
5114
|
-
get isProperty() {
|
5115
|
-
return this.id === AccountSetupItemsEnum.PROPERTY;
|
5116
|
-
}
|
5117
|
-
get isBankFeeds() {
|
5118
|
-
return this.id === AccountSetupItemsEnum.BANK_FEEDS;
|
5119
|
-
}
|
5120
|
-
get isWorkLogbook() {
|
5121
|
-
return this.id === AccountSetupItemsEnum.WORK_LOGBOOK;
|
5122
|
-
}
|
5123
|
-
get isTransactionAllocate() {
|
5124
|
-
return this.id === AccountSetupItemsEnum.TRANSACTION_ALLOCATE;
|
5125
|
-
}
|
5126
|
-
get isSoleBusiness() {
|
5127
|
-
return this.id === AccountSetupItemsEnum.SOLE_BUSINESS;
|
5128
|
-
}
|
5129
|
-
get isHoldings() {
|
5130
|
-
return this.id === AccountSetupItemsEnum.HOLDINGS;
|
5131
|
-
}
|
5132
|
-
get isFirmDetails() {
|
5133
|
-
return this.id === AccountSetupItemsEnum.FIRM_DETAILS;
|
5134
|
-
}
|
5135
|
-
get isInviteTeam() {
|
5136
|
-
return this.id === AccountSetupItemsEnum.INVITE_TEAM;
|
5137
|
-
}
|
5138
|
-
get isInviteClients() {
|
5139
|
-
return this.id === AccountSetupItemsEnum.INVITE_CLIENTS;
|
5140
|
-
}
|
5141
|
-
}
|
5142
|
-
|
5143
|
-
class User extends User$1 {
|
5144
|
-
constructor() {
|
5145
|
-
super(...arguments);
|
5146
|
-
this.blacklistSetupItems = [];
|
5147
|
-
}
|
5148
|
-
get fullName() {
|
5149
|
-
return `${this.firstName} ${this.lastName}`;
|
5150
|
-
}
|
5151
|
-
get photo() {
|
5152
|
-
return this.file?.publicUrl;
|
5153
|
-
}
|
5154
|
-
get activeSubscription() {
|
5155
|
-
return this.subscriptions.find((ss) => ss.isActive);
|
5156
|
-
}
|
5157
|
-
get lastSubscription() {
|
5158
|
-
return this.subscriptions[this.subscriptions.length - 1];
|
5159
|
-
}
|
5160
|
-
/**
|
5161
|
-
* @TODO refactor
|
5162
|
-
*
|
5163
|
-
*/
|
5164
|
-
get position() {
|
5165
|
-
switch (true) {
|
5166
|
-
case this.isFirmOwner():
|
5167
|
-
return USER_WORK_POSITION[UserRolesEnum.FIRM_OWNER];
|
5168
|
-
case this.isManager():
|
5169
|
-
return USER_WORK_POSITION[UserRolesEnum.FIRM_MANAGER];
|
5170
|
-
case this.isEmployee():
|
5171
|
-
return USER_WORK_POSITION[UserRolesEnum.EMPLOYEE];
|
5172
|
-
default:
|
5173
|
-
return '';
|
5174
|
-
}
|
5175
|
-
}
|
5176
|
-
/**
|
5177
|
-
* search roles including hierarchy
|
5178
|
-
*/
|
5179
|
-
hasRoles(roles) {
|
5180
|
-
roles = roles instanceof Array ? roles : [roles];
|
5181
|
-
if (!roles.length) {
|
5182
|
-
return true;
|
5183
|
-
}
|
5184
|
-
roles = flatten(roles.map((role) => USER_ROLES[role]));
|
5185
|
-
return !!intersection(this.roles, roles).length;
|
5186
|
-
}
|
5187
|
-
isOnboarding() {
|
5188
|
-
return this.status === UserStatusEnum.ON_BOARDING;
|
5189
|
-
}
|
5190
|
-
isInactive() {
|
5191
|
-
return this.status === UserStatusEnum.INACTIVE;
|
5192
|
-
}
|
5193
|
-
hasSubscription() {
|
5194
|
-
return this.roles.includes(UserRolesEnum.SUBSCRIPTION);
|
5195
|
-
}
|
5196
|
-
isLoggedIn() {
|
5197
|
-
return this.id === +localStorage.getItem('userId');
|
5198
|
-
}
|
5199
|
-
isClient() {
|
5200
|
-
return this.roles.includes(UserRolesEnum.CLIENT);
|
5201
|
-
}
|
5202
|
-
isEmployee() {
|
5203
|
-
return this.isAccountant() || this.isAdvisor();
|
5204
|
-
}
|
5205
|
-
isAccountant() {
|
5206
|
-
return this.roles.includes(UserRolesEnum.ACCOUNTANT);
|
5218
|
+
return this.method === VehicleClaimDetailsMethodEnum.LOGBOOK;
|
5207
5219
|
}
|
5208
|
-
|
5209
|
-
return this.
|
5220
|
+
isKmsMethod() {
|
5221
|
+
return this.method === VehicleClaimDetailsMethodEnum.KMS;
|
5210
5222
|
}
|
5211
|
-
|
5212
|
-
|
5223
|
+
}
|
5224
|
+
__decorate([
|
5225
|
+
Type(() => User)
|
5226
|
+
], VehicleClaimDetails.prototype, "user", void 0);
|
5227
|
+
|
5228
|
+
class VehicleClaim extends VehicleClaim$1 {
|
5229
|
+
constructor() {
|
5230
|
+
super(...arguments);
|
5231
|
+
this.kilometers = 0;
|
5232
|
+
this.workUsage = 0;
|
5213
5233
|
}
|
5214
5234
|
/**
|
5215
|
-
*
|
5235
|
+
* limit for kms claim method
|
5216
5236
|
*/
|
5217
|
-
|
5218
|
-
|
5237
|
+
static { this.totalKmsLimit = 5000; }
|
5238
|
+
/**
|
5239
|
+
* limit for work usage claim method
|
5240
|
+
*/
|
5241
|
+
static { this.totalWorkUsagePercent = 100; }
|
5242
|
+
isWorkTank() {
|
5243
|
+
return !this.business;
|
5219
5244
|
}
|
5220
|
-
|
5221
|
-
return this.
|
5245
|
+
isSoleTank() {
|
5246
|
+
return !!this.business;
|
5222
5247
|
}
|
5223
|
-
|
5224
|
-
return this.
|
5248
|
+
get tankType() {
|
5249
|
+
return this.isSoleTank() ? TankTypeEnum.SOLE : TankTypeEnum.WORK;
|
5225
5250
|
}
|
5226
5251
|
/**
|
5227
|
-
*
|
5252
|
+
* Claim amount for KMs method. Exists only for KMs method.
|
5228
5253
|
*/
|
5229
|
-
|
5230
|
-
return this.
|
5231
|
-
this.roles.includes(UserRolesEnum.PROPERTY_TANK) :
|
5232
|
-
!!this.getSubscriptionRole(UserRolesEnum.PROPERTY_TANK);
|
5254
|
+
getKMSClaimAmount(vehicleClaimRate) {
|
5255
|
+
return round(this.kilometers * vehicleClaimRate, 2);
|
5233
5256
|
}
|
5234
5257
|
/**
|
5235
|
-
*
|
5258
|
+
* Get logbook claim amount. Exists only for logbook method.
|
5259
|
+
* ClaimAmount = WorkUsage * transaction/depreciation amount
|
5236
5260
|
*/
|
5237
|
-
|
5238
|
-
|
5239
|
-
|
5240
|
-
|
5261
|
+
getLogbookClaimAmount(transactions) {
|
5262
|
+
const transactionsAmount = transactions
|
5263
|
+
.getByVehicleClaim(this)
|
5264
|
+
.getLogbookTransactions()
|
5265
|
+
.sumBy('amount');
|
5266
|
+
// Math.abs because amount will be negative (because we sum expenses), but we don't want negative percent value
|
5267
|
+
return Math.abs(transactionsAmount) * this.workUsage / 100;
|
5241
5268
|
}
|
5242
|
-
|
5243
|
-
|
5244
|
-
* @param roleType by which role should be returned
|
5245
|
-
*/
|
5246
|
-
getSubscriptionRole(roleType) {
|
5247
|
-
/**
|
5248
|
-
* Add @TODO for Alex to check if we should use getLastSubscription here
|
5249
|
-
*/
|
5250
|
-
return this.activeSubscription?.items
|
5251
|
-
.find((subscriptionItem) => subscriptionItem.price.product.role.includes(roleType));
|
5269
|
+
getAverageWeeklyKMS() {
|
5270
|
+
return this.kilometers / FinancialYear.weeksInYear;
|
5252
5271
|
}
|
5253
|
-
|
5254
|
-
|
5272
|
+
}
|
5273
|
+
__decorate([
|
5274
|
+
Type(() => VehicleClaimDetails)
|
5275
|
+
], VehicleClaim.prototype, "details", void 0);
|
5276
|
+
__decorate([
|
5277
|
+
Type(() => SoleBusiness)
|
5278
|
+
], VehicleClaim.prototype, "business", void 0);
|
5279
|
+
|
5280
|
+
/**
|
5281
|
+
* Depreciation Nested Tree node with depreciations group
|
5282
|
+
*/
|
5283
|
+
class DepreciationGroup {
|
5284
|
+
constructor(label, description, icon, children, totalCost, openingValue) {
|
5285
|
+
this.label = label;
|
5286
|
+
this.description = description;
|
5287
|
+
this.icon = icon;
|
5288
|
+
this.children = children;
|
5289
|
+
this.totalCost = totalCost;
|
5290
|
+
this.openingValue = openingValue;
|
5255
5291
|
}
|
5256
|
-
|
5257
|
-
|
5258
|
-
* starts from 2022 for new users and registeredYear - 1 for old users
|
5259
|
-
*/
|
5260
|
-
get financialYears() {
|
5261
|
-
return range(Math.min(FinancialYear.toFinYear(this.createdAt) - 1, 2022), FinancialYear.toFinYear(new Date()) + 1);
|
5292
|
+
getClaimAmount() {
|
5293
|
+
return this.children.reduce((sum, child) => sum + child.getClaimAmount(), 0);
|
5262
5294
|
}
|
5263
|
-
|
5264
|
-
return this.
|
5295
|
+
getAmount() {
|
5296
|
+
return this.children.reduce((sum, child) => sum + child.getAmount(), 0);
|
5297
|
+
}
|
5298
|
+
}
|
5299
|
+
|
5300
|
+
/**
|
5301
|
+
* @TODO Alex useless class, use parent instead
|
5302
|
+
* Depreciation Tree node with depreciation details
|
5303
|
+
*/
|
5304
|
+
class DepreciationGroupItem extends DepreciationGroup {
|
5305
|
+
constructor(depreciation) {
|
5306
|
+
super(depreciation.chartAccounts.name, depreciation.description, 'property');
|
5307
|
+
this.depreciation = depreciation;
|
5308
|
+
}
|
5309
|
+
getClaimAmount() {
|
5310
|
+
return this.depreciation.currentYearForecast.claimAmount;
|
5311
|
+
}
|
5312
|
+
getAmount() {
|
5313
|
+
return this.depreciation.currentYearForecast.amount;
|
5265
5314
|
}
|
5266
5315
|
}
|
5316
|
+
|
5317
|
+
var DepreciationGroupEnum;
|
5318
|
+
(function (DepreciationGroupEnum) {
|
5319
|
+
DepreciationGroupEnum[DepreciationGroupEnum["BUILDING_IMPROVEMENTS"] = 0] = "BUILDING_IMPROVEMENTS";
|
5320
|
+
DepreciationGroupEnum[DepreciationGroupEnum["PLANT_EQUIPMENT"] = 1] = "PLANT_EQUIPMENT";
|
5321
|
+
DepreciationGroupEnum[DepreciationGroupEnum["LOW_VALUE_POOL"] = 2] = "LOW_VALUE_POOL";
|
5322
|
+
DepreciationGroupEnum[DepreciationGroupEnum["WRITTEN_OFF_ITEMS"] = 3] = "WRITTEN_OFF_ITEMS";
|
5323
|
+
DepreciationGroupEnum[DepreciationGroupEnum["BORROWING_EXPENSES"] = 4] = "BORROWING_EXPENSES";
|
5324
|
+
DepreciationGroupEnum[DepreciationGroupEnum["SMALL_BUSINESS_POOL"] = 5] = "SMALL_BUSINESS_POOL";
|
5325
|
+
})(DepreciationGroupEnum || (DepreciationGroupEnum = {}));
|
5326
|
+
|
5327
|
+
const DEPRECIATION_GROUPS = {
|
5328
|
+
[DepreciationGroupEnum.BORROWING_EXPENSES]: {
|
5329
|
+
label: 'Borrowing Expenses',
|
5330
|
+
description: 'Borrowing expenses on loans are deductible over 1826 days (5 years) starting from the date of a loan',
|
5331
|
+
icon: 'loan'
|
5332
|
+
},
|
5333
|
+
[DepreciationGroupEnum.BUILDING_IMPROVEMENTS]: {
|
5334
|
+
label: 'Building & Improvements',
|
5335
|
+
description: 'Construction costs, renovations and capital improvements which depreciate at 2.5%',
|
5336
|
+
icon: 'building-improvements'
|
5337
|
+
},
|
5338
|
+
[DepreciationGroupEnum.PLANT_EQUIPMENT]: {
|
5339
|
+
label: 'Plant & Equipment',
|
5340
|
+
description: 'Assets which decline in value over their useful life (as prescribed by the ATO)',
|
5341
|
+
icon: 'plant-equipment'
|
5342
|
+
},
|
5343
|
+
[DepreciationGroupEnum.LOW_VALUE_POOL]: {
|
5344
|
+
label: 'Low Value Pool',
|
5345
|
+
description: 'Items under $1,000 are added to the pool to maximise depreciation',
|
5346
|
+
icon: 'lvp'
|
5347
|
+
},
|
5348
|
+
[DepreciationGroupEnum.WRITTEN_OFF_ITEMS]: {
|
5349
|
+
label: 'Written Off Items',
|
5350
|
+
description: 'Items below $300, replaced or obsolete are fully deductible',
|
5351
|
+
icon: 'cart'
|
5352
|
+
},
|
5353
|
+
[DepreciationGroupEnum.SMALL_BUSINESS_POOL]: {
|
5354
|
+
label: 'Small business pool',
|
5355
|
+
description: 'The small business pool allows business owners to claim depreciation on plant and equipment items at an accelerated rate.',
|
5356
|
+
icon: 'portfolio'
|
5357
|
+
},
|
5358
|
+
};
|
5359
|
+
|
5360
|
+
/**
|
5361
|
+
* Depreciation Low Value Pool rate based on asset financial year (current or subsequent years).
|
5362
|
+
*/
|
5363
|
+
var DepreciationLvpRateEnum;
|
5364
|
+
(function (DepreciationLvpRateEnum) {
|
5365
|
+
DepreciationLvpRateEnum[DepreciationLvpRateEnum["FIRST_YEAR"] = 0.1875] = "FIRST_YEAR";
|
5366
|
+
DepreciationLvpRateEnum[DepreciationLvpRateEnum["DEFAULT"] = 0.375] = "DEFAULT";
|
5367
|
+
})(DepreciationLvpRateEnum || (DepreciationLvpRateEnum = {}));
|
5368
|
+
|
5369
|
+
class SoleBusiness extends SoleBusiness$1 {
|
5370
|
+
/**
|
5371
|
+
* Maximum number of businesses that a person can have, according to the ATO
|
5372
|
+
*/
|
5373
|
+
static { this.businessesLimit = 6; }
|
5374
|
+
}
|
5267
5375
|
__decorate([
|
5268
|
-
Type(() =>
|
5269
|
-
],
|
5376
|
+
Type(() => User)
|
5377
|
+
], SoleBusiness.prototype, "user", void 0);
|
5270
5378
|
__decorate([
|
5271
|
-
Type(() =>
|
5272
|
-
],
|
5379
|
+
Type(() => SoleBusinessAllocation)
|
5380
|
+
], SoleBusiness.prototype, "allocations", void 0);
|
5273
5381
|
__decorate([
|
5274
|
-
Type(() =>
|
5275
|
-
],
|
5382
|
+
Type(() => SoleBusinessLoss)
|
5383
|
+
], SoleBusiness.prototype, "losses", void 0);
|
5276
5384
|
__decorate([
|
5277
|
-
Type(() =>
|
5278
|
-
],
|
5385
|
+
Type(() => SoleInvoice)
|
5386
|
+
], SoleBusiness.prototype, "invoices", void 0);
|
5279
5387
|
__decorate([
|
5280
|
-
Type(() =>
|
5281
|
-
],
|
5388
|
+
Type(() => SoleInvoiceTemplate)
|
5389
|
+
], SoleBusiness.prototype, "invoiceTemplates", void 0);
|
5282
5390
|
__decorate([
|
5283
|
-
Type(() =>
|
5284
|
-
],
|
5391
|
+
Type(() => VehicleClaim)
|
5392
|
+
], SoleBusiness.prototype, "vehicleClaims", void 0);
|
5285
5393
|
__decorate([
|
5286
|
-
Type(() =>
|
5287
|
-
],
|
5394
|
+
Type(() => Transaction)
|
5395
|
+
], SoleBusiness.prototype, "transactions", void 0);
|
5288
5396
|
__decorate([
|
5289
|
-
Type(() =>
|
5290
|
-
],
|
5397
|
+
Type(() => Depreciation)
|
5398
|
+
], SoleBusiness.prototype, "depreciations", void 0);
|
5291
5399
|
__decorate([
|
5292
|
-
Type(() =>
|
5293
|
-
],
|
5400
|
+
Type(() => SoleBusinessActivity$1)
|
5401
|
+
], SoleBusiness.prototype, "activity", void 0);
|
5294
5402
|
__decorate([
|
5295
|
-
Type(() =>
|
5296
|
-
],
|
5403
|
+
Type(() => IncomeSource)
|
5404
|
+
], SoleBusiness.prototype, "incomeSource", void 0);
|
5405
|
+
__decorate([
|
5406
|
+
Transform(({ value }) => value || false)
|
5407
|
+
], SoleBusiness.prototype, "isPrimaryProduction", void 0);
|
5408
|
+
__decorate([
|
5409
|
+
Type(() => AppFile)
|
5410
|
+
], SoleBusiness.prototype, "file", void 0);
|
5297
5411
|
|
5298
|
-
class
|
5299
|
-
|
5300
|
-
|
5301
|
-
|
5302
|
-
|
5303
|
-
|
5304
|
-
|
5305
|
-
|
5306
|
-
|
5307
|
-
|
5308
|
-
|
5309
|
-
|
5310
|
-
return this.netPay * FinancialYear.weeksInYear / FinancialYear.monthsInYear / 2;
|
5311
|
-
case SalaryForecastFrequencyEnum.WEEKLY:
|
5312
|
-
return this.netPay * FinancialYear.weeksInYear / FinancialYear.monthsInYear;
|
5313
|
-
default:
|
5314
|
-
return this.netPay;
|
5315
|
-
}
|
5412
|
+
class SoleBusinessActivity extends SoleBusinessActivity$1 {
|
5413
|
+
}
|
5414
|
+
|
5415
|
+
var SoleDepreciationMethodEnum;
|
5416
|
+
(function (SoleDepreciationMethodEnum) {
|
5417
|
+
SoleDepreciationMethodEnum[SoleDepreciationMethodEnum["SBP"] = 1] = "SBP";
|
5418
|
+
SoleDepreciationMethodEnum[SoleDepreciationMethodEnum["DEPRECIATION"] = 2] = "DEPRECIATION";
|
5419
|
+
})(SoleDepreciationMethodEnum || (SoleDepreciationMethodEnum = {}));
|
5420
|
+
|
5421
|
+
class SoleDepreciationMethod extends SoleDepreciationMethod$1 {
|
5422
|
+
isSBP() {
|
5423
|
+
return this.method === SoleDepreciationMethodEnum.SBP;
|
5316
5424
|
}
|
5317
5425
|
}
|
5318
|
-
|
5319
|
-
|
5320
|
-
|
5321
|
-
__decorate([
|
5322
|
-
Type(() => Number)
|
5323
|
-
], SalaryForecast.prototype, "netPay", void 0);
|
5324
|
-
__decorate([
|
5325
|
-
Type(() => IncomeSource)
|
5326
|
-
], SalaryForecast.prototype, "incomeSource", void 0);
|
5426
|
+
|
5427
|
+
class SoleDetails extends SoleDetails$1 {
|
5428
|
+
}
|
5327
5429
|
__decorate([
|
5328
5430
|
Type(() => User)
|
5329
|
-
],
|
5431
|
+
], SoleDetails.prototype, "user", void 0);
|
5330
5432
|
|
5331
|
-
class
|
5332
|
-
get
|
5333
|
-
return this.
|
5433
|
+
class BasReport extends BasReport$1 {
|
5434
|
+
get taxWithheldTotal() {
|
5435
|
+
return this.taxWithheldSalary + this.taxWithheldNoABN;
|
5436
|
+
}
|
5437
|
+
get paygTaxInstalmentOwedToATO() {
|
5438
|
+
return this.paygTaxInstalment > 0 ? this.paygTaxInstalment : 0;
|
5439
|
+
}
|
5440
|
+
get paygTaxInstalmentOwedByATO() {
|
5441
|
+
return this.paygTaxInstalment < 0 ? Math.abs(this.paygTaxInstalment) : 0;
|
5442
|
+
}
|
5443
|
+
get fuelTaxCreditOwedToATO() {
|
5444
|
+
return this.fuelTaxCredit < 0 ? this.fuelTaxCredit : 0;
|
5445
|
+
}
|
5446
|
+
get fuelTaxCreditOwedByATO() {
|
5447
|
+
return this.fuelTaxCredit > 0 ? Math.abs(this.fuelTaxCredit) : 0;
|
5448
|
+
}
|
5449
|
+
get owesToATO() {
|
5450
|
+
return this.incomeGST + this.taxWithheldTotal + this.paygTaxInstalmentOwedToATO + this.fuelTaxCreditOwedToATO;
|
5451
|
+
}
|
5452
|
+
get owedByATO() {
|
5453
|
+
return this.expenseGST + this.paygTaxInstalmentOwedByATO + this.fuelTaxCreditOwedByATO;
|
5454
|
+
}
|
5455
|
+
/**
|
5456
|
+
* GST payable to the ATO, or refundable from the ATO in case it's negative
|
5457
|
+
*/
|
5458
|
+
get gst() {
|
5459
|
+
if (!this.id) {
|
5460
|
+
return 0;
|
5461
|
+
}
|
5462
|
+
return this.incomeGST + this.expenseGST + this.taxWithheldTotal + this.paygTaxInstalment - this.fuelTaxCredit;
|
5334
5463
|
}
|
5335
5464
|
}
|
5336
5465
|
__decorate([
|
5337
|
-
Type(() =>
|
5338
|
-
],
|
5466
|
+
Type(() => Date)
|
5467
|
+
], BasReport.prototype, "dateFrom", void 0);
|
5339
5468
|
__decorate([
|
5340
|
-
Type(() =>
|
5341
|
-
],
|
5342
|
-
|
5343
|
-
var IncomeSourceForecastTrustTypeEnum;
|
5344
|
-
(function (IncomeSourceForecastTrustTypeEnum) {
|
5345
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["SPECIAL_DISABILITY_TRUST"] = 1] = "SPECIAL_DISABILITY_TRUST";
|
5346
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["DECEASED_ESTATE"] = 2] = "DECEASED_ESTATE";
|
5347
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["FIXED_TRUST"] = 3] = "FIXED_TRUST";
|
5348
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["HYBRID_TRUST"] = 4] = "HYBRID_TRUST";
|
5349
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["DISCRETIONARY_SERVICE_TRUST"] = 5] = "DISCRETIONARY_SERVICE_TRUST";
|
5350
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["DISCRETIONARY_TRADING_TRUST"] = 6] = "DISCRETIONARY_TRADING_TRUST";
|
5351
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["DISCRETIONARY_INVESTMENT_TRUST"] = 7] = "DISCRETIONARY_INVESTMENT_TRUST";
|
5352
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["CASH_MANAGEMENT_UNIT_TRUST"] = 8] = "CASH_MANAGEMENT_UNIT_TRUST";
|
5353
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["PUBLIC_UNIT_TRUST_LISTED"] = 9] = "PUBLIC_UNIT_TRUST_LISTED";
|
5354
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["PUBLIC_UNIT_TRUST_UNLISTED"] = 10] = "PUBLIC_UNIT_TRUST_UNLISTED";
|
5355
|
-
IncomeSourceForecastTrustTypeEnum[IncomeSourceForecastTrustTypeEnum["TESTAMENTARY_TRUST"] = 11] = "TESTAMENTARY_TRUST";
|
5356
|
-
})(IncomeSourceForecastTrustTypeEnum || (IncomeSourceForecastTrustTypeEnum = {}));
|
5357
|
-
|
5358
|
-
var IncomeSourceTypeListOtherEnum;
|
5359
|
-
(function (IncomeSourceTypeListOtherEnum) {
|
5360
|
-
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["PSI"] = 6] = "PSI";
|
5361
|
-
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["SOLE_TRADER"] = 7] = "SOLE_TRADER";
|
5362
|
-
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["TRUSTS"] = 9] = "TRUSTS";
|
5363
|
-
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["OTHER_INCOME"] = 10] = "OTHER_INCOME";
|
5364
|
-
IncomeSourceTypeListOtherEnum[IncomeSourceTypeListOtherEnum["PARTNERSHIPS"] = 12] = "PARTNERSHIPS";
|
5365
|
-
})(IncomeSourceTypeListOtherEnum || (IncomeSourceTypeListOtherEnum = {}));
|
5366
|
-
|
5367
|
-
var IncomeSourceTypeListSoleEnum;
|
5368
|
-
(function (IncomeSourceTypeListSoleEnum) {
|
5369
|
-
IncomeSourceTypeListSoleEnum[IncomeSourceTypeListSoleEnum["SOLE_TRADER"] = 7] = "SOLE_TRADER";
|
5370
|
-
})(IncomeSourceTypeListSoleEnum || (IncomeSourceTypeListSoleEnum = {}));
|
5469
|
+
Type(() => Date)
|
5470
|
+
], BasReport.prototype, "dateTo", void 0);
|
5371
5471
|
|
5372
|
-
|
5373
|
-
|
5374
|
-
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["BONUSES"] = 1] = "BONUSES";
|
5375
|
-
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["DIRECTOR_FEES"] = 2] = "DIRECTOR_FEES";
|
5376
|
-
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["INTEREST"] = 4] = "INTEREST";
|
5377
|
-
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["PENSIONS_AND_ALLOWANCES"] = 5] = "PENSIONS_AND_ALLOWANCES";
|
5378
|
-
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["SUPERANNUATION"] = 8] = "SUPERANNUATION";
|
5379
|
-
IncomeSourceTypeListWorkEnum[IncomeSourceTypeListWorkEnum["ATTRIBUTED_P_S_I"] = 11] = "ATTRIBUTED_P_S_I";
|
5380
|
-
})(IncomeSourceTypeListWorkEnum || (IncomeSourceTypeListWorkEnum = {}));
|
5472
|
+
class SetupItem extends AbstractModel {
|
5473
|
+
}
|
5381
5474
|
|
5382
|
-
|
5383
|
-
|
5384
|
-
|
5385
|
-
|
5386
|
-
|
5387
|
-
|
5388
|
-
|
5389
|
-
|
5475
|
+
/**
|
5476
|
+
* Enum list of all possible account setup items ids. Using with [ACCOUNT_SETUP_ITEMS]{@link ACCOUNT_SETUP_ITEMS}
|
5477
|
+
* @TODO Vik/Nikita: Do we need to generate it from backend? If some ids changed?
|
5478
|
+
*/
|
5479
|
+
var AccountSetupItemsEnum;
|
5480
|
+
(function (AccountSetupItemsEnum) {
|
5481
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["SALARY"] = 1] = "SALARY";
|
5482
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["OTHER_INCOME"] = 2] = "OTHER_INCOME";
|
5483
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["PROPERTY"] = 3] = "PROPERTY";
|
5484
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["BANK_FEEDS"] = 4] = "BANK_FEEDS";
|
5485
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["WORK_LOGBOOK"] = 5] = "WORK_LOGBOOK";
|
5486
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["TRANSACTION_ALLOCATE"] = 6] = "TRANSACTION_ALLOCATE";
|
5487
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["SOLE_BUSINESS"] = 7] = "SOLE_BUSINESS";
|
5488
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["HOLDINGS"] = 8] = "HOLDINGS";
|
5489
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["FIRM_DETAILS"] = 9] = "FIRM_DETAILS";
|
5490
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["INVITE_TEAM"] = 10] = "INVITE_TEAM";
|
5491
|
+
AccountSetupItemsEnum[AccountSetupItemsEnum["INVITE_CLIENTS"] = 11] = "INVITE_CLIENTS";
|
5492
|
+
})(AccountSetupItemsEnum || (AccountSetupItemsEnum = {}));
|
5390
5493
|
|
5391
|
-
class
|
5392
|
-
|
5393
|
-
return this.id ===
|
5494
|
+
class AccountSetupItem extends SetupItem {
|
5495
|
+
get isSalary() {
|
5496
|
+
return this.id === AccountSetupItemsEnum.SALARY;
|
5394
5497
|
}
|
5395
|
-
|
5396
|
-
return
|
5498
|
+
get isOtherIncome() {
|
5499
|
+
return this.id === AccountSetupItemsEnum.OTHER_INCOME;
|
5397
5500
|
}
|
5398
|
-
|
5399
|
-
return
|
5501
|
+
get isProperty() {
|
5502
|
+
return this.id === AccountSetupItemsEnum.PROPERTY;
|
5400
5503
|
}
|
5401
|
-
|
5402
|
-
return
|
5504
|
+
get isBankFeeds() {
|
5505
|
+
return this.id === AccountSetupItemsEnum.BANK_FEEDS;
|
5403
5506
|
}
|
5404
|
-
|
5405
|
-
return
|
5507
|
+
get isWorkLogbook() {
|
5508
|
+
return this.id === AccountSetupItemsEnum.WORK_LOGBOOK;
|
5406
5509
|
}
|
5407
|
-
|
5408
|
-
|
5409
|
-
class IncomeSourceForecast extends IncomeSourceForecast$1 {
|
5410
|
-
constructor() {
|
5411
|
-
super(...arguments);
|
5412
|
-
this.paygIncome = 0;
|
5413
|
-
this.frequency = SalaryForecastFrequencyEnum.ANNUAL;
|
5414
|
-
this.isTaxFree = false;
|
5510
|
+
get isTransactionAllocate() {
|
5511
|
+
return this.id === AccountSetupItemsEnum.TRANSACTION_ALLOCATE;
|
5415
5512
|
}
|
5416
|
-
|
5417
|
-
|
5418
|
-
* and we need these fields to work with Income source forecasts like with Salary Forecasts
|
5419
|
-
*/
|
5420
|
-
get netPay() {
|
5421
|
-
return this.amount;
|
5513
|
+
get isSoleBusiness() {
|
5514
|
+
return this.id === AccountSetupItemsEnum.SOLE_BUSINESS;
|
5422
5515
|
}
|
5423
|
-
get
|
5424
|
-
return this.
|
5516
|
+
get isHoldings() {
|
5517
|
+
return this.id === AccountSetupItemsEnum.HOLDINGS;
|
5425
5518
|
}
|
5426
|
-
get
|
5427
|
-
return this.
|
5519
|
+
get isFirmDetails() {
|
5520
|
+
return this.id === AccountSetupItemsEnum.FIRM_DETAILS;
|
5521
|
+
}
|
5522
|
+
get isInviteTeam() {
|
5523
|
+
return this.id === AccountSetupItemsEnum.INVITE_TEAM;
|
5524
|
+
}
|
5525
|
+
get isInviteClients() {
|
5526
|
+
return this.id === AccountSetupItemsEnum.INVITE_CLIENTS;
|
5428
5527
|
}
|
5429
5528
|
}
|
5430
|
-
__decorate([
|
5431
|
-
Type(() => IncomeSourceType)
|
5432
|
-
], IncomeSourceForecast.prototype, "incomeSourceType", void 0);
|
5433
|
-
__decorate([
|
5434
|
-
Type(() => IncomeSource)
|
5435
|
-
], IncomeSourceForecast.prototype, "incomeSource", void 0);
|
5436
5529
|
|
5437
|
-
class
|
5438
|
-
|
5439
|
-
|
5530
|
+
class User extends User$1 {
|
5531
|
+
constructor() {
|
5532
|
+
super(...arguments);
|
5533
|
+
this.blacklistSetupItems = [];
|
5440
5534
|
}
|
5441
|
-
|
5442
|
-
return this.
|
5535
|
+
get fullName() {
|
5536
|
+
return `${this.firstName} ${this.lastName}`;
|
5443
5537
|
}
|
5444
|
-
|
5445
|
-
return this.
|
5538
|
+
get photo() {
|
5539
|
+
return this.file?.publicUrl;
|
5446
5540
|
}
|
5447
|
-
|
5448
|
-
return this.
|
5541
|
+
get activeSubscription() {
|
5542
|
+
return this.subscriptions.find((ss) => ss.isActive);
|
5449
5543
|
}
|
5450
|
-
|
5451
|
-
|
5452
|
-
*/
|
5453
|
-
get forecasts() {
|
5454
|
-
return [...this.salaryForecasts, ...this.incomeSourceForecasts, ...this.soleForecasts];
|
5544
|
+
get lastSubscription() {
|
5545
|
+
return this.subscriptions[this.subscriptions.length - 1];
|
5455
5546
|
}
|
5456
5547
|
/**
|
5457
|
-
*
|
5548
|
+
* @TODO refactor
|
5549
|
+
*
|
5458
5550
|
*/
|
5459
|
-
get
|
5460
|
-
|
5551
|
+
get position() {
|
5552
|
+
switch (true) {
|
5553
|
+
case this.isFirmOwner():
|
5554
|
+
return USER_WORK_POSITION[UserRolesEnum.FIRM_OWNER];
|
5555
|
+
case this.isManager():
|
5556
|
+
return USER_WORK_POSITION[UserRolesEnum.FIRM_MANAGER];
|
5557
|
+
case this.isEmployee():
|
5558
|
+
return USER_WORK_POSITION[UserRolesEnum.EMPLOYEE];
|
5559
|
+
default:
|
5560
|
+
return '';
|
5561
|
+
}
|
5461
5562
|
}
|
5462
5563
|
/**
|
5463
|
-
*
|
5464
|
-
* @param monthIndex by which month should be taken
|
5564
|
+
* search roles including hierarchy
|
5465
5565
|
*/
|
5466
|
-
|
5467
|
-
|
5468
|
-
|
5566
|
+
hasRoles(roles) {
|
5567
|
+
roles = roles instanceof Array ? roles : [roles];
|
5568
|
+
if (!roles.length) {
|
5569
|
+
return true;
|
5570
|
+
}
|
5571
|
+
roles = flatten(roles.map((role) => USER_ROLES[role]));
|
5572
|
+
return !!intersection(this.roles, roles).length;
|
5573
|
+
}
|
5574
|
+
isOnboarding() {
|
5575
|
+
return this.status === UserStatusEnum.ON_BOARDING;
|
5576
|
+
}
|
5577
|
+
isInactive() {
|
5578
|
+
return this.status === UserStatusEnum.INACTIVE;
|
5579
|
+
}
|
5580
|
+
hasSubscription() {
|
5581
|
+
return this.roles.includes(UserRolesEnum.SUBSCRIPTION);
|
5582
|
+
}
|
5583
|
+
isLoggedIn() {
|
5584
|
+
return this.id === +localStorage.getItem('userId');
|
5585
|
+
}
|
5586
|
+
isClient() {
|
5587
|
+
return this.roles.includes(UserRolesEnum.CLIENT);
|
5588
|
+
}
|
5589
|
+
isEmployee() {
|
5590
|
+
return this.isAccountant() || this.isAdvisor();
|
5591
|
+
}
|
5592
|
+
isAccountant() {
|
5593
|
+
return this.roles.includes(UserRolesEnum.ACCOUNTANT);
|
5594
|
+
}
|
5595
|
+
isAdvisor() {
|
5596
|
+
return this.roles.includes(UserRolesEnum.ADVISOR);
|
5469
5597
|
}
|
5470
|
-
|
5471
|
-
|
5472
|
-
Type(() => SalaryForecast)
|
5473
|
-
], IncomeSource.prototype, "salaryForecasts", void 0);
|
5474
|
-
__decorate([
|
5475
|
-
Type(() => SoleForecast)
|
5476
|
-
], IncomeSource.prototype, "soleForecasts", void 0);
|
5477
|
-
__decorate([
|
5478
|
-
Type(() => IncomeSourceForecast)
|
5479
|
-
], IncomeSource.prototype, "incomeSourceForecasts", void 0);
|
5480
|
-
__decorate([
|
5481
|
-
Type(() => Date)
|
5482
|
-
], IncomeSource.prototype, "dateFrom", void 0);
|
5483
|
-
__decorate([
|
5484
|
-
Type(() => Date)
|
5485
|
-
], IncomeSource.prototype, "dateTo", void 0);
|
5486
|
-
|
5487
|
-
/**
|
5488
|
-
* Income sources chart data
|
5489
|
-
*/
|
5490
|
-
class IncomeSourceChartData {
|
5491
|
-
constructor(forecastedIncomeAmount, transactions) {
|
5492
|
-
this.forecastedIncomeAmount = forecastedIncomeAmount;
|
5493
|
-
this.transactions = transactions;
|
5598
|
+
isImpersonator() {
|
5599
|
+
return this.roles.includes(UserRolesEnum.SWITCH_USER);
|
5494
5600
|
}
|
5495
5601
|
/**
|
5496
|
-
*
|
5602
|
+
* Check if current user is firm owner
|
5497
5603
|
*/
|
5498
|
-
|
5499
|
-
|
5500
|
-
id: 'actualIncome',
|
5501
|
-
name: 'Actual Income',
|
5502
|
-
data: [],
|
5503
|
-
// display future actual incomes with dash line and past actual incomes with solid line
|
5504
|
-
zones: [{
|
5505
|
-
// line style after current month
|
5506
|
-
value: new FinancialYear().getMonthDate(new Date().getMonth()).getTime(),
|
5507
|
-
dashStyle: 'Solid'
|
5508
|
-
}, {
|
5509
|
-
// default line style
|
5510
|
-
dashStyle: 'Dash'
|
5511
|
-
}]
|
5512
|
-
}, {
|
5513
|
-
id: 'forecastedIncome',
|
5514
|
-
name: 'Forecasted Income',
|
5515
|
-
data: [],
|
5516
|
-
}];
|
5517
|
-
for (const key in MonthNameShortEnum) {
|
5518
|
-
if (MonthNameShortEnum.hasOwnProperty(key)) {
|
5519
|
-
// transaction collection for provided month
|
5520
|
-
const monthTransactionCollection = this.transactions.getByMonth(+MonthNumberEnum[key]);
|
5521
|
-
chartData[0].data.push([new FinancialYear().getMonthDate(+MonthNumberEnum[key]).getTime(), monthTransactionCollection.amount]);
|
5522
|
-
chartData[1].data.push([new FinancialYear().getMonthDate(+MonthNumberEnum[key]).getTime(), this.forecastedIncomeAmount / 12]);
|
5523
|
-
}
|
5524
|
-
}
|
5525
|
-
return chartData;
|
5526
|
-
}
|
5527
|
-
}
|
5528
|
-
|
5529
|
-
class AllocationRuleTransaction extends AllocationRuleTransaction$1 {
|
5530
|
-
constructor() {
|
5531
|
-
super(...arguments);
|
5532
|
-
this.claimPercent = 100;
|
5533
|
-
this.tax = 0;
|
5534
|
-
this.amount = null;
|
5604
|
+
isFirmOwner() {
|
5605
|
+
return this.roles.includes(UserRolesEnum.FIRM_OWNER);
|
5535
5606
|
}
|
5536
|
-
|
5537
|
-
return this.
|
5607
|
+
isTopManager() {
|
5608
|
+
return this.roles.includes(UserRolesEnum.FIRM_TOP_MANAGER) || this.roles.includes(UserRolesEnum.FIRM_OWNER);
|
5538
5609
|
}
|
5539
|
-
|
5540
|
-
|
5541
|
-
return null;
|
5542
|
-
}
|
5543
|
-
let claimPercent = this.chartAccounts.taxablePercent;
|
5544
|
-
// Property claim (ownership% x shared%) for property expenses, taxable percent for others
|
5545
|
-
if (this.chartAccounts?.isProperty() && this.property) {
|
5546
|
-
if (this.chartAccounts.isPropertyExpense() && this.chartAccounts.id !== ChartAccountsListEnum.PLATFORM_FEES) {
|
5547
|
-
claimPercent *= this.property?.claimCoefficient;
|
5548
|
-
}
|
5549
|
-
}
|
5550
|
-
return claimPercent;
|
5610
|
+
isManager() {
|
5611
|
+
return this.roles.includes(UserRolesEnum.FIRM_MANAGER) || this.roles.includes(UserRolesEnum.FIRM_TOP_MANAGER) || this.roles.includes(UserRolesEnum.FIRM_OWNER);
|
5551
5612
|
}
|
5552
5613
|
/**
|
5553
|
-
*
|
5614
|
+
* check if user has property tank access
|
5554
5615
|
*/
|
5555
|
-
|
5556
|
-
return
|
5616
|
+
hasPropertyTank() {
|
5617
|
+
return this.roles ?
|
5618
|
+
this.roles.includes(UserRolesEnum.PROPERTY_TANK) :
|
5619
|
+
!!this.getSubscriptionRole(UserRolesEnum.PROPERTY_TANK);
|
5557
5620
|
}
|
5558
5621
|
/**
|
5559
|
-
*
|
5622
|
+
* check if user has property tank access
|
5560
5623
|
*/
|
5561
|
-
|
5562
|
-
|
5563
|
-
|
5564
|
-
|
5565
|
-
tax: this.tax,
|
5566
|
-
claimPercent: this.claimPercent,
|
5567
|
-
chartAccounts: this.chartAccounts,
|
5568
|
-
property: this.property,
|
5569
|
-
loan: this.loan,
|
5570
|
-
incomeSource: this.incomeSource,
|
5571
|
-
metaFields: this.metaFields,
|
5572
|
-
business: this.business,
|
5573
|
-
source: TransactionSourceEnum.BANK_TRANSACTION,
|
5574
|
-
operation: TransactionOperationEnum.ALLOCATE,
|
5575
|
-
transactions: [],
|
5576
|
-
});
|
5577
|
-
// split allocation
|
5578
|
-
if (this.amountPercent) {
|
5579
|
-
transaction.amount = bankTransaction.amount * this.amountPercentCoefficient / this.gstCoefficient;
|
5580
|
-
}
|
5581
|
-
// child transactions inherit most of the fields from parent transaction
|
5582
|
-
this.childTransactions.forEach((childRuleTransaction) => {
|
5583
|
-
const childTransaction = childRuleTransaction.toTransaction();
|
5584
|
-
childTransaction.amount = childRuleTransaction.amount;
|
5585
|
-
childTransaction.setParent(transaction);
|
5586
|
-
transaction.transactions.push(childTransaction);
|
5587
|
-
});
|
5588
|
-
return transaction;
|
5624
|
+
hasWorkTank() {
|
5625
|
+
return this.roles ?
|
5626
|
+
this.roles.includes(UserRolesEnum.WORK_TANK) :
|
5627
|
+
!!this.getSubscriptionRole(UserRolesEnum.WORK_TANK);
|
5589
5628
|
}
|
5590
|
-
|
5591
|
-
|
5592
|
-
|
5593
|
-
|
5594
|
-
|
5595
|
-
|
5596
|
-
|
5597
|
-
|
5598
|
-
|
5599
|
-
|
5600
|
-
], AllocationRuleTransaction.prototype, "property", void 0);
|
5601
|
-
__decorate([
|
5602
|
-
Type(() => Loan),
|
5603
|
-
Transform(({ value }) => value ? { id: value.id } : null, { toPlainOnly: true })
|
5604
|
-
], AllocationRuleTransaction.prototype, "loan", void 0);
|
5605
|
-
__decorate([
|
5606
|
-
Type(() => IncomeSource),
|
5607
|
-
Transform(({ value }) => value ? { id: value.id } : null, { toPlainOnly: true })
|
5608
|
-
], AllocationRuleTransaction.prototype, "incomeSource", void 0);
|
5609
|
-
__decorate([
|
5610
|
-
Type(() => SoleBusiness),
|
5611
|
-
Transform(({ value }) => value ? { id: value.id } : null, { toPlainOnly: true })
|
5612
|
-
], AllocationRuleTransaction.prototype, "business", void 0);
|
5613
|
-
__decorate([
|
5614
|
-
Type(() => AllocationRuleTransactionMetaField)
|
5615
|
-
], AllocationRuleTransaction.prototype, "metaFields", void 0);
|
5616
|
-
__decorate([
|
5617
|
-
Type(() => AllocationRuleTransaction)
|
5618
|
-
], AllocationRuleTransaction.prototype, "parentTransaction", void 0);
|
5619
|
-
__decorate([
|
5620
|
-
Type(() => AllocationRuleTransaction)
|
5621
|
-
], AllocationRuleTransaction.prototype, "childTransactions", void 0);
|
5622
|
-
__decorate([
|
5623
|
-
Type(() => Number)
|
5624
|
-
], AllocationRuleTransaction.prototype, "claimPercent", void 0);
|
5625
|
-
__decorate([
|
5626
|
-
Type(() => Number)
|
5627
|
-
], AllocationRuleTransaction.prototype, "tax", void 0);
|
5628
|
-
|
5629
|
-
var TransactionTypeEnum;
|
5630
|
-
(function (TransactionTypeEnum) {
|
5631
|
-
TransactionTypeEnum[TransactionTypeEnum["DEBIT"] = 1] = "DEBIT";
|
5632
|
-
TransactionTypeEnum[TransactionTypeEnum["CREDIT"] = 2] = "CREDIT";
|
5633
|
-
})(TransactionTypeEnum || (TransactionTypeEnum = {}));
|
5634
|
-
|
5635
|
-
class TaxExemption extends TaxExemption$1 {
|
5636
|
-
isPartial() {
|
5637
|
-
return [TaxExemptionEnum.INVESTMENT_TO_PPR, TaxExemptionEnum.PPR_TO_INVESTMENT].includes(this.id);
|
5629
|
+
/**
|
5630
|
+
* Get user subscription role by provided role type
|
5631
|
+
* @param roleType by which role should be returned
|
5632
|
+
*/
|
5633
|
+
getSubscriptionRole(roleType) {
|
5634
|
+
/**
|
5635
|
+
* Add @TODO for Alex to check if we should use getLastSubscription here
|
5636
|
+
*/
|
5637
|
+
return this.activeSubscription?.items
|
5638
|
+
.find((subscriptionItem) => subscriptionItem.price.product.role.includes(roleType));
|
5638
5639
|
}
|
5639
|
-
|
5640
|
-
|
5641
|
-
class AssetSale extends ObservableModel {
|
5642
|
-
static { this.className = 'AssetSale'; }
|
5643
|
-
}
|
5644
|
-
__decorate([
|
5645
|
-
Type(() => Date)
|
5646
|
-
], AssetSale.prototype, "date", void 0);
|
5647
|
-
|
5648
|
-
class PropertySale extends AssetSale {
|
5649
|
-
get saleCostsTotalAmount() {
|
5650
|
-
return this.commission + this.legalFees + this.otherCost;
|
5640
|
+
isCurrentFinancialYear() {
|
5641
|
+
return new FinancialYear(new Date()).year === this.financialYear;
|
5651
5642
|
}
|
5652
5643
|
/**
|
5653
|
-
*
|
5654
|
-
*
|
5644
|
+
* financial years available in the app for user
|
5645
|
+
* starts from 2022 for new users and registeredYear - 1 for old users
|
5655
5646
|
*/
|
5656
|
-
|
5657
|
-
return this.
|
5647
|
+
get financialYears() {
|
5648
|
+
return range(Math.min(FinancialYear.toFinYear(this.createdAt) - 1, 2022), FinancialYear.toFinYear(new Date()) + 1);
|
5658
5649
|
}
|
5659
|
-
get
|
5660
|
-
return this.
|
5650
|
+
get firmBranchNames() {
|
5651
|
+
return this.employeeDetails.firmBranchNames;
|
5661
5652
|
}
|
5662
5653
|
}
|
5663
5654
|
__decorate([
|
5664
|
-
Type(() =>
|
5665
|
-
],
|
5666
|
-
__decorate([
|
5667
|
-
Type(() => Number)
|
5668
|
-
], PropertySale.prototype, "structuralImprovementsWDV", void 0);
|
5655
|
+
Type(() => ServiceSubscription)
|
5656
|
+
], User.prototype, "subscriptions", void 0);
|
5669
5657
|
__decorate([
|
5670
|
-
Type(() =>
|
5671
|
-
],
|
5658
|
+
Type(() => ClientDetails)
|
5659
|
+
], User.prototype, "clientDetails", void 0);
|
5672
5660
|
__decorate([
|
5673
|
-
Type(() =>
|
5674
|
-
],
|
5661
|
+
Type(() => EmployeeDetails)
|
5662
|
+
], User.prototype, "employeeDetails", void 0);
|
5675
5663
|
__decorate([
|
5676
|
-
Type(() =>
|
5677
|
-
],
|
5664
|
+
Type(() => SoleDetails)
|
5665
|
+
], User.prototype, "soleDetails", void 0);
|
5678
5666
|
__decorate([
|
5679
|
-
Type(() =>
|
5680
|
-
],
|
5667
|
+
Type(() => Address)
|
5668
|
+
], User.prototype, "address", void 0);
|
5681
5669
|
__decorate([
|
5682
|
-
Type(() =>
|
5683
|
-
],
|
5670
|
+
Type(() => Phone)
|
5671
|
+
], User.prototype, "phone", void 0);
|
5684
5672
|
__decorate([
|
5685
5673
|
Type(() => Date)
|
5686
|
-
],
|
5674
|
+
], User.prototype, "createdAt", void 0);
|
5687
5675
|
__decorate([
|
5688
|
-
Type(() =>
|
5689
|
-
],
|
5676
|
+
Type(() => User)
|
5677
|
+
], User.prototype, "clients", void 0);
|
5690
5678
|
__decorate([
|
5691
|
-
Type(() =>
|
5692
|
-
],
|
5679
|
+
Type(() => AppFile)
|
5680
|
+
], User.prototype, "file", void 0);
|
5693
5681
|
__decorate([
|
5694
|
-
Type(() =>
|
5695
|
-
],
|
5682
|
+
Type(() => AccountSetupItem)
|
5683
|
+
], User.prototype, "blacklistSetupItems", void 0);
|
5696
5684
|
|
5697
5685
|
class PropertySubscription extends PropertySubscription$1 {
|
5698
5686
|
}
|
@@ -5816,9 +5804,6 @@ __decorate([
|
|
5816
5804
|
__decorate([
|
5817
5805
|
Transform(({ value }) => +value)
|
5818
5806
|
], PropertyForecast.prototype, "marketValue", void 0);
|
5819
|
-
__decorate([
|
5820
|
-
Type(() => User)
|
5821
|
-
], PropertyForecast.prototype, "updatedBy", void 0);
|
5822
5807
|
|
5823
5808
|
/**
|
5824
5809
|
* propertySale docs - https://taxtank.atlassian.net/wiki/spaces/TAXTANK/pages/4209508353/Property+Sold+button
|
@@ -5852,7 +5837,8 @@ class Property extends Property$1 {
|
|
5852
5837
|
}
|
5853
5838
|
get currentYearForecast() {
|
5854
5839
|
const year = new FinancialYear().year;
|
5855
|
-
return this.forecasts.find((forecast) => forecast.financialYear === year)
|
5840
|
+
return this.forecasts.find((forecast) => forecast.financialYear === year)
|
5841
|
+
?? plainToClass(PropertyForecast, {});
|
5856
5842
|
}
|
5857
5843
|
get forecastedRentalReturn() {
|
5858
5844
|
return this.currentYearForecast?.rentalReturn || 0;
|