1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets;
18
19 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataList;
20 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
21 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
22 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetType;
23 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
24 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
25 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTaxBasis;
26 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
27 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
28 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
29 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
30
31 import java.util.ArrayList;
32 import java.util.Comparator;
33 import java.util.HashMap;
34 import java.util.Iterator;
35 import java.util.List;
36 import java.util.Map;
37
38
39
40
41 public final class MoneyWiseXAnalysisTaxBasisAccountBucket
42 extends MoneyWiseXAnalysisTaxBasisBaseBucket {
43
44
45
46 private static final MetisFieldSet<MoneyWiseXAnalysisTaxBasisAccountBucket> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisTaxBasisAccountBucket.class);
47
48
49
50
51 static {
52 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.TRANSACTION_ACCOUNT, MoneyWiseXAnalysisTaxBasisAccountBucket::getAccount);
53 }
54
55
56
57
58 private final Long theAssetId;
59
60
61
62
63 private final MoneyWiseTransAsset theAccount;
64
65
66
67
68
69
70
71
72 MoneyWiseXAnalysisTaxBasisAccountBucket(final MoneyWiseXAnalysisHolder pAnalysis,
73 final MoneyWiseTaxBasis pTaxBasis,
74 final MoneyWiseTransAsset pAccount) {
75
76 super(pAnalysis, pTaxBasis);
77 theAssetId = deriveAssetId(pAccount);
78 theAccount = pAccount;
79 }
80
81
82
83
84
85
86
87
88 private MoneyWiseXAnalysisTaxBasisAccountBucket(final MoneyWiseXAnalysisHolder pAnalysis,
89 final MoneyWiseXAnalysisTaxBasisAccountBucket pBase,
90 final OceanusDate pDate) {
91
92 super(pAnalysis, pBase, pDate);
93 theAssetId = pBase.getBucketId();
94 theAccount = pBase.getAccount();
95 }
96
97
98
99
100
101
102
103
104 private MoneyWiseXAnalysisTaxBasisAccountBucket(final MoneyWiseXAnalysisHolder pAnalysis,
105 final MoneyWiseXAnalysisTaxBasisAccountBucket pBase,
106 final OceanusDateRange pRange) {
107
108 super(pAnalysis, pBase, pRange);
109 theAssetId = pBase.getBucketId();
110 theAccount = pBase.getAccount();
111 }
112
113
114
115
116
117
118
119 private static Long deriveAssetId(final MoneyWiseTransAsset pAsset) {
120
121 return MoneyWiseAssetType.createAlternateExternalId(MoneyWiseAssetType.TAXBASISACCOUNT, pAsset.getExternalId());
122 }
123
124 @Override
125 public MetisFieldSet<MoneyWiseXAnalysisTaxBasisAccountBucket> getDataFieldSet() {
126 return FIELD_DEFS;
127 }
128
129 @Override
130 public Integer getIndexedId() {
131 return theAccount.getExternalId().intValue();
132 }
133
134 @Override
135 public Long getBucketId() {
136 return theAssetId;
137 }
138
139
140
141
142
143
144 public String getSimpleName() {
145 return theAccount.getName();
146 }
147
148 @Override
149 public String getName() {
150 return getTaxBasis().getName()
151 + ':'
152 + getSimpleName();
153 }
154
155
156
157
158
159
160 public MoneyWiseTransAsset getAccount() {
161 return theAccount;
162 }
163
164
165
166
167 public static class MoneyWiseXAnalysisTaxBasisAccountBucketList
168 implements MetisFieldItem, MetisDataList<MoneyWiseXAnalysisTaxBasisAccountBucket> {
169
170
171
172 private static final MetisFieldSet<MoneyWiseXAnalysisTaxBasisAccountBucketList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseXAnalysisTaxBasisAccountBucketList.class);
173
174
175
176
177 static {
178 FIELD_DEFS.declareLocalField(MoneyWiseXAnalysisBucketResource.ANALYSIS_NAME, MoneyWiseXAnalysisTaxBasisAccountBucketList::getAnalysis);
179 }
180
181
182
183
184 private final MoneyWiseXAnalysisHolder theAnalysis;
185
186
187
188
189 private final List<MoneyWiseXAnalysisTaxBasisAccountBucket> theList;
190
191
192
193
194 private final MoneyWiseTaxBasis theTaxBasis;
195
196
197
198
199 private final Map<Long, MoneyWiseXAnalysisTaxBasisAccountBucket> theMap;
200
201
202
203
204
205
206
207 protected MoneyWiseXAnalysisTaxBasisAccountBucketList(final MoneyWiseXAnalysisHolder pAnalysis,
208 final MoneyWiseTaxBasis pTaxBasis) {
209 theAnalysis = pAnalysis;
210 theTaxBasis = pTaxBasis;
211 theMap = new HashMap<>();
212 theList = new ArrayList<>();
213 }
214
215
216
217
218
219
220
221
222
223 protected MoneyWiseXAnalysisTaxBasisAccountBucketList(final MoneyWiseXAnalysisHolder pAnalysis,
224 final MoneyWiseTaxBasis pTaxBasis,
225 final MoneyWiseXAnalysisTaxBasisAccountBucketList pBase,
226 final OceanusDate pDate) {
227
228 this(pAnalysis, pTaxBasis);
229
230
231 final Iterator<MoneyWiseXAnalysisTaxBasisAccountBucket> myIterator = pBase.iterator();
232 while (myIterator.hasNext()) {
233 final MoneyWiseXAnalysisTaxBasisAccountBucket myCurr = myIterator.next();
234
235
236 final MoneyWiseXAnalysisTaxBasisAccountBucket myBucket = new MoneyWiseXAnalysisTaxBasisAccountBucket(pAnalysis, myCurr, pDate);
237
238
239 if (!myBucket.isIdle()) {
240
241 theList.add(myBucket);
242 theMap.put(myBucket.getBucketId(), myBucket);
243 }
244 }
245 }
246
247
248
249
250
251
252
253
254
255 protected MoneyWiseXAnalysisTaxBasisAccountBucketList(final MoneyWiseXAnalysisHolder pAnalysis,
256 final MoneyWiseTaxBasis pTaxBasis,
257 final MoneyWiseXAnalysisTaxBasisAccountBucketList pBase,
258 final OceanusDateRange pRange) {
259
260 this(pAnalysis, pTaxBasis);
261
262
263 final Iterator<MoneyWiseXAnalysisTaxBasisAccountBucket> myIterator = pBase.iterator();
264 while (myIterator.hasNext()) {
265 final MoneyWiseXAnalysisTaxBasisAccountBucket myCurr = myIterator.next();
266
267
268 final MoneyWiseXAnalysisTaxBasisAccountBucket myBucket = new MoneyWiseXAnalysisTaxBasisAccountBucket(pAnalysis, myCurr, pRange);
269
270
271 if (!myBucket.isIdle()) {
272
273 myBucket.adjustToBase();
274
275
276 theList.add(myBucket);
277 theMap.put(myBucket.getBucketId(), myBucket);
278 }
279 }
280 }
281
282 @Override
283 public MetisFieldSet<MoneyWiseXAnalysisTaxBasisAccountBucketList> getDataFieldSet() {
284 return FIELD_DEFS;
285 }
286
287 @Override
288 public List<MoneyWiseXAnalysisTaxBasisAccountBucket> getUnderlyingList() {
289 return theList;
290 }
291
292 @Override
293 public String formatObject(final OceanusDataFormatter pFormatter) {
294 return getDataFieldSet().getName();
295 }
296
297
298
299
300
301
302 protected MoneyWiseXAnalysisHolder getAnalysis() {
303 return theAnalysis;
304 }
305
306
307
308
309
310
311
312
313
314 MoneyWiseXAnalysisTaxBasisBaseBucket adjustValue(final MoneyWiseTransAsset pAccount,
315 final OceanusMoney pValue,
316 final MoneyWiseXTaxBasisAdjust pAdjust) {
317
318 final MoneyWiseXAnalysisTaxBasisAccountBucket myBucket = getBucket(pAccount);
319
320
321 return myBucket.adjustValue(pAccount, pValue, pAdjust);
322 }
323
324
325
326
327
328
329
330 private MoneyWiseXAnalysisTaxBasisAccountBucket getBucket(final MoneyWiseTransAsset pAccount) {
331
332 final Long myKey = deriveAssetId(pAccount);
333 return theMap.computeIfAbsent(myKey, m -> {
334
335 final MoneyWiseXAnalysisTaxBasisAccountBucket myNew = new MoneyWiseXAnalysisTaxBasisAccountBucket(theAnalysis, theTaxBasis, pAccount);
336
337
338 theList.add(myNew);
339 return myNew;
340 });
341 }
342
343
344
345
346 protected void sortBuckets() {
347 theList.sort(Comparator.comparing(MoneyWiseXAnalysisTaxBasisAccountBucket::getBucketId));
348 }
349
350
351
352
353
354
355
356 protected MoneyWiseXAnalysisTaxBasisAccountBucket findBucket(final MoneyWiseTransAsset pAccount) {
357
358 final Long myKey = deriveAssetId(pAccount);
359 return theMap.get(myKey);
360 }
361 }
362 }