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.date.OceanusFiscalYear;
21 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusRate;
22 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
23 import io.github.tonywasher.joceanus.metis.preference.MetisPreferenceManager;
24 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTaxClass;
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.MoneyWiseTaxYear;
28
29 import java.time.Month;
30
31
32
33
34 public class MoneyWiseUKTaxYear
35 extends MoneyWiseTaxYear {
36
37
38
39 private static final MetisFieldSet<MoneyWiseUKTaxYear> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseUKTaxYear.class);
40
41
42
43
44 static {
45 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXYEAR_ALLOWANCES, MoneyWiseUKTaxYear::getAllowances);
46 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXYEAR_BANDS, MoneyWiseUKTaxYear::getTaxBands);
47 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXYEAR_INTEREST, MoneyWiseUKTaxYear::getInterestScheme);
48 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXYEAR_DIVIDEND, MoneyWiseUKTaxYear::getDividendScheme);
49 FIELD_DEFS.declareLocalField(MoneyWiseTaxResource.TAXYEAR_CAPITAL, MoneyWiseUKTaxYear::getCapitalScheme);
50 }
51
52
53
54
55 private final MoneyWiseUKBasicAllowance theAllowances;
56
57
58
59
60 private final MoneyWiseUKTaxBands theTaxBands;
61
62
63
64
65 private final MoneyWiseUKIncomeScheme theIncomeScheme;
66
67
68
69
70 private final MoneyWiseUKRoomRentalScheme theRentalScheme;
71
72
73
74
75 private final MoneyWiseUKInterestScheme theInterestScheme;
76
77
78
79
80 private final MoneyWiseUKDividendScheme theDividendScheme;
81
82
83
84
85 private final MoneyWiseUKChargeableGainsScheme theChargeableGainsScheme;
86
87
88
89
90 private final MoneyWiseUKCapitalScheme theCapitalScheme;
91
92
93
94
95
96
97
98
99
100
101
102 protected MoneyWiseUKTaxYear(final int pDate,
103 final MoneyWiseUKBasicAllowance pAllowances,
104 final MoneyWiseUKTaxBands pTaxBands,
105 final MoneyWiseUKInterestScheme pInterest,
106 final MoneyWiseUKDividendScheme pDividend,
107 final MoneyWiseUKCapitalScheme pCapital) {
108 super(getDate(pDate));
109 theAllowances = pAllowances;
110 theTaxBands = pTaxBands;
111 theIncomeScheme = new MoneyWiseUKIncomeScheme();
112 theRentalScheme = new MoneyWiseUKRoomRentalScheme();
113 theInterestScheme = pInterest;
114 theDividendScheme = pDividend;
115 theChargeableGainsScheme = new MoneyWiseUKChargeableGainsScheme();
116 theCapitalScheme = pCapital;
117 }
118
119
120
121
122
123
124 public MoneyWiseUKBasicAllowance getAllowances() {
125 return theAllowances;
126 }
127
128
129
130
131
132
133 public MoneyWiseUKTaxBands getTaxBands() {
134 return theTaxBands;
135 }
136
137
138
139
140
141
142 private MoneyWiseUKInterestScheme getInterestScheme() {
143 return theInterestScheme;
144 }
145
146
147
148
149
150
151 private MoneyWiseUKDividendScheme getDividendScheme() {
152 return theDividendScheme;
153 }
154
155
156
157
158
159
160 private MoneyWiseUKCapitalScheme getCapitalScheme() {
161 return theCapitalScheme;
162 }
163
164
165
166
167
168
169
170 private static OceanusDate getDate(final int pYear) {
171 final OceanusDate myDate = new OceanusDate(pYear, Month.JANUARY, 1);
172 return OceanusFiscalYear.UK.endOfYear(myDate);
173 }
174
175 @Override
176 public MetisFieldSet<MoneyWiseUKTaxYear> getDataFieldSet() {
177 return FIELD_DEFS;
178 }
179
180 @Override
181 public boolean isTaxCreditRequired() {
182 return !(theAllowances instanceof MoneyWiseUKSavingsAllowance);
183 }
184
185 @Override
186 public OceanusRate getTaxCreditRateForInterest() {
187 return theInterestScheme.getTaxCreditRate(this);
188 }
189
190 @Override
191 public OceanusRate getTaxCreditRateForDividend() {
192 return theDividendScheme.getTaxCreditRate(this);
193 }
194
195 @Override
196 public MoneyWiseUKTaxAnalysis analyseTaxYear(final MetisPreferenceManager pPreferences,
197 final MoneyWiseTaxSource pTaxSource) {
198
199 final MoneyWiseUKTaxAnalysis myAnalysis = new MoneyWiseUKTaxAnalysis(pTaxSource, pPreferences, this);
200
201
202 myAnalysis.processItem(MoneyWiseTaxClass.SALARY, theIncomeScheme);
203 myAnalysis.processItem(MoneyWiseTaxClass.RENTALINCOME, theIncomeScheme);
204 myAnalysis.processItem(MoneyWiseTaxClass.ROOMRENTAL, theRentalScheme);
205 myAnalysis.processItem(MoneyWiseTaxClass.OTHERINCOME, theIncomeScheme);
206
207
208 myAnalysis.processItem(MoneyWiseTaxClass.TAXEDINTEREST, theInterestScheme);
209 myAnalysis.processItem(MoneyWiseTaxClass.UNTAXEDINTEREST, theInterestScheme);
210 myAnalysis.processItem(MoneyWiseTaxClass.PEER2PEERINTEREST, theInterestScheme);
211
212
213 myAnalysis.processItem(MoneyWiseTaxClass.DIVIDEND, theDividendScheme);
214 myAnalysis.processItem(MoneyWiseTaxClass.UNITTRUSTDIVIDEND, theDividendScheme);
215 myAnalysis.processItem(MoneyWiseTaxClass.FOREIGNDIVIDEND, theDividendScheme);
216
217
218 myAnalysis.processItem(MoneyWiseTaxClass.CHARGEABLEGAINS, theChargeableGainsScheme);
219
220
221 myAnalysis.processItem(MoneyWiseTaxClass.RESIDENTIALGAINS, theCapitalScheme);
222 myAnalysis.processItem(MoneyWiseTaxClass.CAPITALGAINS, theCapitalScheme);
223
224
225 myAnalysis.calculateTaxDue();
226 myAnalysis.calculateTaxProfit();
227
228
229 return myAnalysis;
230 }
231 }