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