homeflowjs 1.0.67 → 1.0.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/utils/stamp-duty-calculator/english-rates.js +32 -25
- package/utils/stamp-duty-calculator/scotand-rates.js +48 -0
- package/utils/stamp-duty-calculator/stamp-duty-calculator.js +9 -11
- package/utils/stamp-duty-calculator/stamp-duty-utils.js +3 -3
- package/utils/stamp-duty-calculator/wales-rates.js +41 -0
- package/utils/stamp-duty-calculator/country-rates.js +0 -49
package/package.json
CHANGED
@@ -9,40 +9,47 @@ const englishRates = (
|
|
9
9
|
) => {
|
10
10
|
const englandRatesList = Homeflow.get('stamp_duty_england');
|
11
11
|
|
12
|
-
const
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
12
|
+
const ratesToCalculateBasedOnTaxType = () => {
|
13
|
+
const baseRates = englandRatesList['base'];
|
14
|
+
const firstTimeBuyerRates = englandRatesList['first_time_buyer'];
|
15
|
+
|
16
|
+
if (firstTimeBuyer) {
|
17
|
+
const priceLimit = firstTimeBuyerRates[firstTimeBuyerRates?.length - 1]
|
18
|
+
?.['maximum_property_price'];
|
19
|
+
|
20
|
+
if (priceLimit && price > priceLimit) {
|
21
|
+
return baseRates;
|
22
|
+
} else {
|
23
|
+
return firstTimeBuyerRates;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
return baseRates;
|
27
28
|
}
|
28
29
|
|
29
|
-
const
|
30
|
+
const ratesList = ratesToCalculateBasedOnTaxType();
|
31
|
+
|
32
|
+
const stampDutyRatesCalculation = ratesList.reduce((accumulator, _, index) => {
|
30
33
|
// Minumun price from the 1st braket should be always 0
|
31
34
|
const minimunFallback = index === 0 ? 0 : Number.POSITIVE_INFINITY;
|
32
|
-
const minimumPropertyPrice =
|
33
|
-
const
|
35
|
+
const minimumPropertyPrice = ratesList[index]['minimum_property_price'] || minimunFallback;
|
36
|
+
const maximumPropertyPrice = ratesList[index]['maximum_property_price'] || Number.POSITIVE_INFINITY;
|
34
37
|
const rateIndex = `rate${index + 1}`;
|
35
|
-
let percentageFromList = +(
|
38
|
+
let percentageFromList = +(ratesList[index]['base_sdlt_rate']) / 100;
|
39
|
+
|
40
|
+
if (!ukResident && ratesList[index]?.['non_uk_resident_surcharge']) {
|
41
|
+
percentageFromList += (+(ratesList[index]?.['non_uk_resident_surcharge']) / 100);
|
42
|
+
}
|
36
43
|
|
37
|
-
if (
|
38
|
-
percentageFromList += (+(
|
44
|
+
if ((additionalProperty || isCompany) && ratesList[index]?.['additional_property_surcharge']) {
|
45
|
+
percentageFromList += (+(ratesList[index]?.['additional_property_surcharge']) / 100);
|
39
46
|
}
|
40
47
|
|
41
48
|
percentageFromList = parseFloat(percentageFromList.toFixed(3));
|
42
49
|
|
43
|
-
const rateForTheBracket =
|
44
|
-
|
45
|
-
|
50
|
+
const rateForTheBracket = calculateRange(
|
51
|
+
price, minimumPropertyPrice, maximumPropertyPrice, percentageFromList,
|
52
|
+
);
|
46
53
|
|
47
54
|
accumulator[rateIndex] = rateForTheBracket;
|
48
55
|
accumulator.totalRate += rateForTheBracket;
|
@@ -51,7 +58,7 @@ const englishRates = (
|
|
51
58
|
|
52
59
|
return accumulator;
|
53
60
|
}, {
|
54
|
-
totalRate:
|
61
|
+
totalRate: 0,
|
55
62
|
effectiveRate: 0,
|
56
63
|
});
|
57
64
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import { calculateRange, getPriceBracketIndex } from "./stamp-duty-utils";
|
2
|
+
|
3
|
+
const scotlandRates = (price, firstTimeBuyer, additionalProperty, isCompany) => {
|
4
|
+
const scotlandRatesList = Homeflow.get('stamp_duty_scotland');
|
5
|
+
|
6
|
+
const ratesToCalculateBasedOnTaxType = () => {
|
7
|
+
if(firstTimeBuyer) return scotlandRatesList['first_time_buyer'];
|
8
|
+
return scotlandRatesList['base'];
|
9
|
+
};
|
10
|
+
|
11
|
+
const ratesList = ratesToCalculateBasedOnTaxType();
|
12
|
+
|
13
|
+
const stampDutyRatesCalculation = ratesList.reduce((accumulator, _, index) => {
|
14
|
+
// Minumun price from the 1st braket should be always 0
|
15
|
+
const minimunFallback = index === 0 ? 0 : Number.POSITIVE_INFINITY;
|
16
|
+
const percentageFromList = +(ratesList[index]['base_lbtt_rate']) / 100;
|
17
|
+
const minimumPropertyPrice = ratesList[index]['minimum_property_price'] || minimunFallback;
|
18
|
+
const maximumPropertyPrice = ratesList[index]['maximum_property_price'] || Number.POSITIVE_INFINITY;
|
19
|
+
const rateIndex = `rate${index + 1}`;
|
20
|
+
const rateForTheBracket = calculateRange(price, minimumPropertyPrice, maximumPropertyPrice, percentageFromList);
|
21
|
+
|
22
|
+
accumulator[rateIndex] = rateForTheBracket;
|
23
|
+
accumulator.totalRate += rateForTheBracket;
|
24
|
+
|
25
|
+
accumulator.effectiveRate = (accumulator.totalRate / price) * 100;
|
26
|
+
|
27
|
+
return accumulator;
|
28
|
+
}, {
|
29
|
+
totalRate: 0,
|
30
|
+
effectiveRate: 0,
|
31
|
+
});
|
32
|
+
|
33
|
+
if (additionalProperty || isCompany) {
|
34
|
+
const additionalDwellingSurcharge = ratesList[getPriceBracketIndex(price, ratesList)]
|
35
|
+
?.['additional_property_surcharge'];
|
36
|
+
if (additionalDwellingSurcharge) {
|
37
|
+
stampDutyRatesCalculation.totalRate += ((price * additionalDwellingSurcharge) / 100);
|
38
|
+
};
|
39
|
+
}
|
40
|
+
|
41
|
+
// Roundings
|
42
|
+
stampDutyRatesCalculation.effectiveRate = Math.round(stampDutyRatesCalculation.effectiveRate * 10) / 10;
|
43
|
+
stampDutyRatesCalculation.totalRate = Math.round(stampDutyRatesCalculation.totalRate);
|
44
|
+
|
45
|
+
return stampDutyRatesCalculation;
|
46
|
+
};
|
47
|
+
|
48
|
+
export default scotlandRates;
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import englishRates from './english-rates';
|
2
|
-
import
|
2
|
+
import walesRates from './wales-rates';
|
3
|
+
import scotlandRates from './scotand-rates';
|
3
4
|
|
4
5
|
/**
|
5
6
|
* We already have a DefaultStampDutyCalculator component,
|
@@ -17,16 +18,13 @@ const stampDutyCalculator = ({
|
|
17
18
|
};
|
18
19
|
}
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
if (
|
26
|
-
|
27
|
-
|| country?.toLowerCase() === 'wales')
|
28
|
-
{
|
29
|
-
return countryRates(price, firstTimeBuyer, additionalProperty, ukResident, country);
|
21
|
+
if (country?.toLowerCase() === 'scotland') {
|
22
|
+
return scotlandRates(price, firstTimeBuyer, additionalProperty, isCompany);
|
23
|
+
};
|
24
|
+
|
25
|
+
|
26
|
+
if (country?.toLowerCase() === 'wales') {
|
27
|
+
return walesRates(price, additionalProperty, isCompany);
|
30
28
|
}
|
31
29
|
|
32
30
|
// If country not is not specified use English rates by default
|
@@ -12,10 +12,10 @@ export const getPriceBracketIndex = (price, arr) => {
|
|
12
12
|
|
13
13
|
arr.forEach((rates, index) => {
|
14
14
|
if (
|
15
|
-
(+(rates.maximum_property_price) || Number.POSITIVE_INFINITY)
|
16
|
-
&& +(rates.minimum_property_price)
|
15
|
+
(+(rates.maximum_property_price) || Number.POSITIVE_INFINITY) >= price
|
16
|
+
&& +(rates.minimum_property_price) <= price
|
17
17
|
) bracketIndex = index;
|
18
18
|
});
|
19
19
|
|
20
|
-
return bracketIndex
|
20
|
+
return bracketIndex;
|
21
21
|
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { calculateRange } from "./stamp-duty-utils";
|
2
|
+
|
3
|
+
const walesRates = (price, additionalProperty, isCompany) => {
|
4
|
+
const walesRatesList = Homeflow.get('stamp_duty_wales');
|
5
|
+
|
6
|
+
const ratesToCalculateBasedOnTaxType = () => {
|
7
|
+
if(additionalProperty || isCompany) return walesRatesList['corporate_buyer'];
|
8
|
+
return walesRatesList['base'];
|
9
|
+
};
|
10
|
+
|
11
|
+
const ratesList = ratesToCalculateBasedOnTaxType();
|
12
|
+
|
13
|
+
const stampDutyRatesCalculation = ratesList.reduce((accumulator, _, index) => {
|
14
|
+
// Minumun price from the 1st braket should be always 0
|
15
|
+
const minimunFallback = index === 0 ? 0 : Number.POSITIVE_INFINITY;
|
16
|
+
const percentageFromList = +(ratesList[index]['base_ltt_rate']) / 100;
|
17
|
+
const minimumPropertyPrice = ratesList[index]['minimum_property_price'] || minimunFallback;
|
18
|
+
const maximumPropertyPrice = ratesList[index]['maximum_property_price'] || Number.POSITIVE_INFINITY;
|
19
|
+
const rateIndex = `rate${index + 1}`;
|
20
|
+
const rateForTheBracket = calculateRange(price, minimumPropertyPrice, maximumPropertyPrice, percentageFromList);
|
21
|
+
|
22
|
+
accumulator[rateIndex] = rateForTheBracket;
|
23
|
+
accumulator.totalRate += rateForTheBracket;
|
24
|
+
|
25
|
+
accumulator.effectiveRate = (accumulator.totalRate / price) * 100;
|
26
|
+
|
27
|
+
return accumulator;
|
28
|
+
}, {
|
29
|
+
totalRate: 0,
|
30
|
+
effectiveRate: 0,
|
31
|
+
});
|
32
|
+
|
33
|
+
// Roundings
|
34
|
+
stampDutyRatesCalculation.effectiveRate = Math.round(stampDutyRatesCalculation.effectiveRate * 10) / 10;
|
35
|
+
stampDutyRatesCalculation.totalRate = Math.round(stampDutyRatesCalculation.totalRate);
|
36
|
+
|
37
|
+
|
38
|
+
return stampDutyRatesCalculation;
|
39
|
+
};
|
40
|
+
|
41
|
+
export default walesRates;
|
@@ -1,49 +0,0 @@
|
|
1
|
-
import { calculateRange } from "./stamp-duty-utils";
|
2
|
-
|
3
|
-
const countryRates = (price, firstTimeBuyer, additionalProperty, ukResident, country) => {
|
4
|
-
const countryConfig = {
|
5
|
-
'scotland': {
|
6
|
-
cmsData: Homeflow.get('stamp_duty_scotland'),
|
7
|
-
base: 'base_lbtt_rate',
|
8
|
-
},
|
9
|
-
'wales': {
|
10
|
-
cmsData: Homeflow.get('stamp_duty_wales'),
|
11
|
-
base: 'base_ltt_rate',
|
12
|
-
}
|
13
|
-
}
|
14
|
-
const cmsRates = countryConfig[country].cmsData;
|
15
|
-
|
16
|
-
const buyerStatusAsKeyOfObject = () => {
|
17
|
-
if(firstTimeBuyer) return 'first_time_buyer_rate';
|
18
|
-
if(additionalProperty) return 'additional_property_rate';
|
19
|
-
return countryConfig[country].base;
|
20
|
-
};
|
21
|
-
|
22
|
-
const stampDutyRatesCalculation = cmsRates.reduce((accumulator, _, index) => {
|
23
|
-
// Minumun price from the 1st braket should be always 0
|
24
|
-
const minimunFallback = index === 0 ? 0 : Number.POSITIVE_INFINITY;
|
25
|
-
const percentageFromList = +(cmsRates[index][buyerStatusAsKeyOfObject()]) / 100;
|
26
|
-
const minimumPropertyPrice = cmsRates[index]['minimum_property_price'] || minimunFallback;
|
27
|
-
const maxisumPropertyPrice = cmsRates[index]['maximum_property_price'] || Number.POSITIVE_INFINITY;
|
28
|
-
const rateIndex = `rate${index + 1}`;
|
29
|
-
const rateForTheBracket = calculateRange(price, minimumPropertyPrice, maxisumPropertyPrice, percentageFromList);
|
30
|
-
|
31
|
-
accumulator[rateIndex] = rateForTheBracket;
|
32
|
-
accumulator.totalRate += rateForTheBracket;
|
33
|
-
|
34
|
-
accumulator.effectiveRate = (accumulator.totalRate / price) * 100;
|
35
|
-
|
36
|
-
return accumulator;
|
37
|
-
}, {
|
38
|
-
totalRate: 0,
|
39
|
-
effectiveRate: 0,
|
40
|
-
});
|
41
|
-
|
42
|
-
// Roundings
|
43
|
-
stampDutyRatesCalculation.effectiveRate = Math.round(stampDutyRatesCalculation.effectiveRate * 10) / 10;
|
44
|
-
stampDutyRatesCalculation.totalRate = Math.round(stampDutyRatesCalculation.totalRate);
|
45
|
-
|
46
|
-
return stampDutyRatesCalculation;
|
47
|
-
};
|
48
|
-
|
49
|
-
export default countryRates;
|