1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.tax.uk;
18
19 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
20 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusRate;
21 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
22 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
23 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseMarginalReduction;
24 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxBandSet.MoneyWiseTaxBand;
25 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxResource;
26
27
28
29
30 public abstract class MoneyWiseUKBasicAllowance
31 implements MetisFieldItem {
32
33
34
35 private static final MetisFieldSet<MoneyWiseUKBasicAllowance> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseUKBasicAllowance.class);
36
37
38
39
40 static {
41 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.ALLOWANCE_BASIC, MoneyWiseUKBasicAllowance::getAllowance);
42 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.ALLOWANCE_RENTAL, MoneyWiseUKBasicAllowance::getRentalAllowance);
43 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.ALLOWANCE_CAPITAL, MoneyWiseUKBasicAllowance::getCapitalAllowance);
44 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.MARGINAL_REDUCTION, MoneyWiseUKBasicAllowance::getMarginalReduction);
45 }
46
47
48
49
50 private final OceanusMoney theAllowance;
51
52
53
54
55 private final OceanusMoney theRentalAllowance;
56
57
58
59
60 private final OceanusMoney theCapitalAllowance;
61
62
63
64
65 private final MoneyWiseMarginalReduction theMarginalReduction;
66
67
68
69
70
71
72
73
74
75 protected MoneyWiseUKBasicAllowance(final OceanusMoney pAllowance,
76 final OceanusMoney pRentalAllowance,
77 final OceanusMoney pCapitalAllowance,
78 final MoneyWiseMarginalReduction pReduction) {
79 theAllowance = pAllowance;
80 theRentalAllowance = pRentalAllowance;
81 theCapitalAllowance = pCapitalAllowance;
82 theMarginalReduction = pReduction;
83 }
84
85
86
87
88
89
90
91
92 protected MoneyWiseUKBasicAllowance(final OceanusMoney pAllowance,
93 final OceanusMoney pRentalAllowance,
94 final OceanusMoney pCapitalAllowance) {
95 this(pAllowance, pRentalAllowance, pCapitalAllowance, MoneyWiseMarginalReduction.TWOINTHREE);
96 }
97
98
99
100
101
102
103 protected OceanusMoney getAllowance() {
104 return theAllowance;
105 }
106
107
108
109
110
111
112 protected OceanusMoney getRentalAllowance() {
113 return theRentalAllowance;
114 }
115
116
117
118
119
120
121 protected OceanusMoney getCapitalAllowance() {
122 return theCapitalAllowance;
123 }
124
125
126
127
128
129
130 protected MoneyWiseMarginalReduction getMarginalReduction() {
131 return theMarginalReduction;
132 }
133
134
135
136
137
138
139
140 protected OceanusMoney calculateBasicAllowance(final MoneyWiseUKTaxConfig pConfig) {
141 return getAllowance();
142 }
143
144
145
146
147
148
149
150 protected OceanusMoney calculateSavingsAllowance(final MoneyWiseUKTaxConfig pConfig) {
151 return getZeroAmount();
152 }
153
154
155
156
157
158
159 protected OceanusMoney calculateDividendAllowance() {
160 return getZeroAmount();
161 }
162
163
164
165
166
167
168
169
170 protected MoneyWiseTaxBand calculateLoSavingsBand(final MoneyWiseUKTaxConfig pConfig,
171 final MoneyWiseTaxBand pLoSavings) {
172
173 if (pLoSavings == null) {
174 return new MoneyWiseTaxBand(getZeroAmount(), OceanusRate.getWholePercentage(0));
175 }
176 final MoneyWiseTaxBand myBand = new MoneyWiseTaxBand(pLoSavings);
177 final OceanusMoney myAmount = myBand.getAmount();
178
179
180 final OceanusMoney myPreSavings = new OceanusMoney(pConfig.getGrossPreSavings());
181 myPreSavings.subtractAmount(pConfig.getAllowance());
182
183
184 if (!myPreSavings.isPositive()) {
185 return myBand;
186 }
187
188
189 myAmount.subtractAmount(myPreSavings);
190
191
192 if (!myAmount.isPositive()) {
193 myAmount.setZero();
194 }
195
196
197 return myBand;
198 }
199
200
201
202
203
204
205 protected OceanusMoney getZeroAmount() {
206
207 final OceanusMoney myAllowance = new OceanusMoney(theAllowance);
208 myAllowance.setZero();
209 return myAllowance;
210 }
211
212
213
214
215
216
217 protected static MetisFieldSet<? extends MoneyWiseUKBasicAllowance> getBaseFieldSet() {
218 return FIELD_DEFS;
219 }
220 }