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.metis.field.MetisFieldItem;
20 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
21 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
22 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTaxClass;
23 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxBandSet;
24 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxBandSet.MoneyWiseTaxBand;
25 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxResource;
26 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseTaxSource;
27 import io.github.tonywasher.joceanus.moneywise.tax.uk.MoneyWiseUKTax.MoneyWiseUKBasicAllowanceCtl;
28 import io.github.tonywasher.joceanus.moneywise.tax.uk.MoneyWiseUKTax.MoneyWiseUKTaxConfigCtl;
29 import io.github.tonywasher.joceanus.moneywise.tax.uk.MoneyWiseUKTax.MoneyWiseUKTaxYearCtl;
30 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
31 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateUtils;
32 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
33 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
34
35
36
37
38 public class MoneyWiseUKTaxConfig
39 implements MetisFieldItem, MoneyWiseUKTaxConfigCtl {
40
41
42
43 private static final MetisFieldSet<MoneyWiseUKTaxConfig> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseUKTaxConfig.class);
44
45
46
47
48 static {
49 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXYEAR_NAME, MoneyWiseUKTaxConfig::getTaxYear);
50 FIELD_DEFS.declareLocalField(MoneyWiseStaticDataType.TAXBASIS, MoneyWiseUKTaxConfig::getTaxSource);
51 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXCONFIG_GROSS, MoneyWiseUKTaxConfig::getGrossTaxable);
52 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXCONFIG_PRESAVINGS, MoneyWiseUKTaxConfig::getGrossPreSavings);
53 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXCONFIG_BIRTHDAY, MoneyWiseUKTaxConfig::getBirthday);
54 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXCONFIG_AGE, MoneyWiseUKTaxConfig::getClientAge);
55 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXCONFIG_AGEALLOWANCE, MoneyWiseUKTaxConfig::hasAgeRelatedAllowance);
56 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.ALLOWANCE_BASIC, MoneyWiseUKTaxConfig::getAllowance);
57 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.ALLOWANCE_RENTAL, MoneyWiseUKTaxConfig::getRentalAllowance);
58 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.ALLOWANCE_SAVINGS, MoneyWiseUKTaxConfig::getSavingsAllowance);
59 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.ALLOWANCE_DIVIDEND, MoneyWiseUKTaxConfig::getDividendAllowance);
60 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.ALLOWANCE_CAPITAL, MoneyWiseUKTaxConfig::getCapitalAllowance);
61 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXYEAR_BANDS, MoneyWiseUKTaxConfig::getTaxBands);
62 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXBANDS_LOSAVINGS, MoneyWiseUKTaxConfig::getLoSavingsBand);
63 }
64
65
66
67
68 private final MoneyWiseUKTaxYearCtl theTaxYear;
69
70
71
72
73 private final MoneyWiseTaxSource theTaxSource;
74
75
76
77
78 private final OceanusMoney theGrossTaxable;
79
80
81
82
83 private final OceanusMoney theGrossPreSavings;
84
85
86
87
88 private final OceanusDate theBirthday;
89
90
91
92
93 private final Integer theClientAge;
94
95
96
97
98 private boolean hasAgeRelatedAllowance;
99
100
101
102
103 private final OceanusMoney theAllowance;
104
105
106
107
108 private final OceanusMoney theRentalAllowance;
109
110
111
112
113 private final OceanusMoney theSavingsAllowance;
114
115
116
117
118 private final OceanusMoney theDividendAllowance;
119
120
121
122
123 private final OceanusMoney theCapitalAllowance;
124
125
126
127
128 private final MoneyWiseTaxBandSet theTaxBands;
129
130
131
132
133 private final MoneyWiseTaxBand theLoSavings;
134
135
136
137
138
139
140
141
142 protected MoneyWiseUKTaxConfig(final MoneyWiseUKTaxYearCtl pTaxYear,
143 final MoneyWiseTaxSource pTaxSource,
144 final OceanusDate pBirthday) {
145
146 theTaxYear = pTaxYear;
147 theTaxSource = pTaxSource;
148 theBirthday = pBirthday;
149 theClientAge = OceanusDateUtils.ageOn(theBirthday, pTaxYear.getYearEnd());
150
151
152 theGrossPreSavings = determineGrossPreSavings();
153 theGrossTaxable = determineGrossTaxableIncome();
154
155
156 final MoneyWiseUKBasicAllowanceCtl myAllowances = theTaxYear.getAllowances();
157
158
159 theAllowance = new OceanusMoney(myAllowances.calculateBasicAllowance(this));
160 theRentalAllowance = new OceanusMoney(myAllowances.getRentalAllowance());
161 theSavingsAllowance = new OceanusMoney(myAllowances.calculateSavingsAllowance(this));
162 theDividendAllowance = new OceanusMoney(myAllowances.calculateDividendAllowance());
163 theCapitalAllowance = new OceanusMoney(myAllowances.getCapitalAllowance());
164
165
166 final MoneyWiseUKTaxBands myBands = (MoneyWiseUKTaxBands) theTaxYear.getTaxBands();
167 theTaxBands = new MoneyWiseTaxBandSet(myBands.getStandardSet());
168
169
170 theLoSavings = myAllowances.calculateLoSavingsBand(this, myBands.getLoSavings());
171 }
172
173
174
175
176
177
178 private MoneyWiseUKTaxConfig(final MoneyWiseUKTaxConfig pSource) {
179
180 theTaxYear = pSource.getTaxYear();
181 theTaxSource = pSource.getTaxSource();
182 theGrossTaxable = pSource.getGrossTaxable();
183 theGrossPreSavings = pSource.getGrossPreSavings();
184 theBirthday = pSource.getBirthday();
185 theClientAge = pSource.getClientAge();
186 hasAgeRelatedAllowance = pSource.hasAgeRelatedAllowance();
187
188
189 theAllowance = new OceanusMoney(pSource.getAllowance());
190 theRentalAllowance = new OceanusMoney(pSource.getRentalAllowance());
191 theSavingsAllowance = new OceanusMoney(pSource.getSavingsAllowance());
192 theDividendAllowance = new OceanusMoney(pSource.getDividendAllowance());
193 theCapitalAllowance = new OceanusMoney(pSource.getCapitalAllowance());
194
195
196 theTaxBands = new MoneyWiseTaxBandSet(pSource.getTaxBands());
197 theLoSavings = new MoneyWiseTaxBand(pSource.getLoSavingsBand());
198 }
199
200 @Override
201 public MoneyWiseUKTaxYearCtl getTaxYear() {
202 return theTaxYear;
203 }
204
205
206
207
208
209
210 public MoneyWiseTaxSource getTaxSource() {
211 return theTaxSource;
212 }
213
214 @Override
215 public OceanusMoney getGrossPreSavings() {
216 return theGrossPreSavings;
217 }
218
219 @Override
220 public OceanusMoney getGrossTaxable() {
221 return theGrossTaxable;
222 }
223
224 @Override
225 public OceanusDate getBirthday() {
226 return theBirthday;
227 }
228
229 @Override
230 public Integer getClientAge() {
231 return theClientAge;
232 }
233
234
235
236
237
238
239 public boolean hasAgeRelatedAllowance() {
240 return hasAgeRelatedAllowance;
241 }
242
243 @Override
244 public void setHasAgeRelatedAllowance(final boolean pFlag) {
245 hasAgeRelatedAllowance = pFlag;
246 }
247
248 @Override
249 public OceanusMoney getAllowance() {
250 return theAllowance;
251 }
252
253
254
255
256
257
258 public OceanusMoney getRentalAllowance() {
259 return theRentalAllowance;
260 }
261
262
263
264
265
266
267 public OceanusMoney getSavingsAllowance() {
268 return theSavingsAllowance;
269 }
270
271
272
273
274
275
276 public OceanusMoney getDividendAllowance() {
277 return theDividendAllowance;
278 }
279
280
281
282
283
284
285 public OceanusMoney getCapitalAllowance() {
286 return theCapitalAllowance;
287 }
288
289
290
291
292
293
294 public MoneyWiseTaxBandSet getTaxBands() {
295 return theTaxBands;
296 }
297
298
299
300
301
302
303 public MoneyWiseTaxBand getLoSavingsBand() {
304 return theLoSavings;
305 }
306
307 @Override
308 public MetisFieldSet<MoneyWiseUKTaxConfig> getDataFieldSet() {
309 return FIELD_DEFS;
310 }
311
312 @Override
313 public String formatObject(final OceanusDataFormatter pFormatter) {
314 return FIELD_DEFS.getName();
315 }
316
317 @Override
318 public MoneyWiseUKTaxConfig cloneIt() {
319 return new MoneyWiseUKTaxConfig(this);
320 }
321
322
323
324
325
326
327 private OceanusMoney determineGrossTaxableIncome() {
328
329 final OceanusMoney myIncome = new OceanusMoney(theGrossPreSavings);
330
331
332 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.TAXEDINTEREST));
333
334
335 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.UNTAXEDINTEREST));
336
337
338 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.DIVIDEND));
339
340
341 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.UNITTRUSTDIVIDEND));
342
343
344 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.FOREIGNDIVIDEND));
345
346
347 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.CHARGEABLEGAINS));
348
349
350
351
352 return myIncome;
353 }
354
355
356
357
358
359
360 private OceanusMoney determineGrossPreSavings() {
361
362 final MoneyWiseUKBasicAllowanceCtl myAllowances = theTaxYear.getAllowances();
363
364
365 final OceanusMoney myIncome = new OceanusMoney(myAllowances.getAllowance());
366 myIncome.setZero();
367
368
369 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.SALARY));
370
371
372 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.OTHERINCOME));
373
374
375 myIncome.addAmount(theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.RENTALINCOME));
376
377
378 final OceanusMoney myChargeable = theTaxSource.getAmountForTaxBasis(MoneyWiseTaxClass.ROOMRENTAL);
379
380
381 final OceanusMoney myAllowance = myAllowances.getRentalAllowance();
382 if (myChargeable.compareTo(myAllowance) > 0) {
383
384 myChargeable.subtractAmount(myAllowance);
385 myIncome.addAmount(myChargeable);
386 }
387
388
389 return myIncome;
390 }
391 }